如何防止Apache httpd(MAMP)中的HTTP文件缓存


139

我正在MAMP中开发一个单页Javascript应用程序。我的JavaScript和HTML模板文件在请求之间被缓存。

有没有一种简单的方法可以在MAMP中指示我要防止http文件缓存?可能带有.htaccess文件?如何.htaccess在Mac上的MAMP虚拟主机上放置或修改虚拟主机?

Answers:


318

试过这个吗?如果在这两个工作.htaccesshttpd.conf并在VirtualHost(通常位于httpd-vhosts.conf如果您已经从它包含的你的httpd.conf)

<filesMatch "\.(html|htm|js|css)$">
  FileETag None
  <ifModule mod_headers.c>
     Header unset ETag
     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
  </ifModule>
</filesMatch>

100%防止文件被缓存

这类似于Google广告采用标头Cache-Control:private,x-gzip-ok =“”>来防止代理和客户端缓存广告的方式。

来自http://www.askapache.com/htaccess/using-http-headers-with-htaccess.html

如果使用的扩展名不是模板扩展名,则可以选择为正在检索的模板文件添加扩展名.html


2
谢谢,这在.htaccess文件中非常有效。当我检查标题时,我可以看到缓存控制选项,并且在请求之间我的文件显示为http 200而不是304,这正是我所需要的。
dmck

2
不要忘记添加LoadModule命令。LoadModule headers_module lib/modules/mod_headers.so
Spenhouet 2014年

我可以将这些标头应用于所有文件类型,而不是一一定义扩展名吗?
Thariq Nugrohotomo

1
@ThariqNugrohotomo是的,有可能!这是一个正则表达式,你可以尝试<filesMatch "\.+"><filesMatch ^>
查理Rudenstål

我不是在Web服务器上使用MAMP,而是在使用Apache。我还必须通过输入“ sudo a2enmod标头”和“ sudo a2enmod过期”在Apache安装上启用标头并使模块到期,然后重新启动sudo服务apache2。不需要LoadModule和IfModule命令/标签-只需省略上面带括号的IfModule标签部分,但仍在它们之间输入Header设置。–
andruo11

5

基于此处的示例:http : //drupal.org/node/550488

以下可能在.htaccess中工作

 <IfModule mod_expires.c>
   # Enable expirations.
   ExpiresActive On

   # Cache all files for 2 weeks after access (A).
   ExpiresDefault A1209600

  <FilesMatch (\.js|\.html)$>
     ExpiresActive Off
  </FilesMatch>
 </IfModule>

不幸的是,当我将.htaccess文件放在项目目录中时,此方法不起作用。我不确定mod_expires是否处于活动状态。
dmck

5
@dmck:删除<IfModule mod_expires.c>and </IfModule>部分..如果未启用mod_expires,您将得到一个错误,而不是那些被悄悄忽略的指令。
Stennie 2012年

在项目目录中,任何轻微的语法错误都可能导致500错误。
SDsolar

3

我遇到了同样的问题,但是在这里找到了一个很好的解决方案: 停止在MAMP中为PHP 5.5.3缓存

基本上找到php.ini文件并注释掉OPCache行。我希望这个替代答案也能帮助其他人。


3
那是关于服务器端PHP缓存,又名OPCache。问题是关于通过HTTP请求的浏览器缓存的文件。
弗里恩

2

没有mod_expires,将很难在文件上设置过期标头。对于生成的任何内容,您当然都可以在答案上设置一些默认标头,执行类似mod_expires的工作:

<?php header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); ?>

(摘自:@brianegge的堆栈溢出答案,其中还解释了mod_expires解决方案)

现在,这不适用于静态文件(例如javascript文件)。至于静态文件,浏览器和源文件之间只有apache(没有任何过期模块)。为防止在浏览器中完成对javascript文件的缓存,您可以在js网址的末尾使用随机令牌,例如?rd=45642111,因此该网址应类似于:

<script type="texte/javascript" src="my/url/myjs.js?rd=4221159546">

如果页面上的该网址是由PHP文件生成的,则只需将随机部分添加到PHP中即可。通过简单地附加随机查询字符串参数来随机化url的这种方式是ajax jQuery请求的no-cache设置的基础。浏览器永远不会将具有不同查询字符串的2个url视为相同,并且永远不会使用缓存的版本。

编辑

注意,您应该测试mod_headers。如果您有mod_headers,则可以直接使用Header关键字设置Expires标


谢谢,很不幸,我没有使用任何PHP文件。我将研究mod_headers并安装mod_expires。
dmck,2012年

如何防止CSS文件缓存?
亚伦弗兰克

1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>

那不是一个好的答案。尝试详细解释解决OP中报告的问题的步骤。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.