Apache(不是浏览器)正在缓存我的文件

时间:2017-03-09 20:18:04

标签: apache .htaccess caching centos

浏览器没有缓存它。它获得响应头:

Accept-Ranges:bytes
Cache-Control:max-age=0, no-cache, no-store, must-revalidate
Connection:Keep-Alive
Content-Length:425169
Content-Type:application/javascript
Date:Thu, 09 Mar 2017 20:06:53 GMT
Expires:Wed, 11 Jan 1984 05:00:00 GMT
Keep-Alive:timeout=5, max=100
Last-Modified:Thu, 09 Mar 2017 20:06:49 GMT
Pragma:no-cache
Server:Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16

我在Apache中的设置:

<VirtualHost *:80>
    <Directory "/webapps/apps/devsite">
        Allow from all
        AllowOverride All
        Order allow,deny
    </Directory>
    DocumentRoot /webapps/apps/devsite
    ServerName testing.devsite.com
    SSLEngine off
</VirtualHost>

我的.htaccess:

<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> 

以下内容加载新的非缓存版本:

    服务器上的
  1. 运行:rm -f /webapps/apps/devsite/scripts/script.js
  2. 在网络浏览器中重新加载(因此获得404)
  3. 将文件复制回服务器
  4. 在浏览器中重新加载
  5. 以下内容会加载旧的CACHED版本!:

    1. 在服务器上运行:rm -f /webapps/apps/devsite/scripts/script.js
    2. 将文件重新复制到服务器(注意:我还没有在浏览器中重新加载)
    3. 在浏览器中重新加载
    4. 这表明Apache在某种程度上缓存它,直到它获得新请求并且无法找到它。为什么?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

问题是它使用内核的SendFile导致它错过了正在更改的文件。这是一个虚拟机共享文件夹。添加以下修复程序:

EnableSendfile off

(&#34;文件&#34;是小写的)

此处有更多信息:https://www.vagrantup.com/docs/synced-folders/virtualbox.html

http://httpd.apache.org/docs/2.2/mod/core.html#enablesendfile

答案 1 :(得分:0)

仅当您请求特定资源时,Apache才会永久监视所有文件。

当您遇到404错误时,Apache会丢失有关之前找到的文件的信息。

当您在此期间未请求资源时,last modified时间戳不会更改。