我将服务器管理软件 plesk 与 apache 和 nginx 一起使用。我在 apache 和 nginx 中为 javascript 文件设置了一个过期的标头一年。那行得通。我可以在标题中看到“过期”的一年。
现在我想通过重写(无重定向)访问 javascript 和 php 文件。
阿帕奇
ExpiresActive On
ExpiresByType text/javascript A31556952
RewriteEngine On
RewriteRule fake/(.+\.(?:js|php))$ original/$1 [L]
NGINX
location ~* ^/(.*\.js)$ {
try_files $uri @fallback;
expires 1y;
add_header Cache-Control "public";
}
该 RewriteRule 正在工作。我可以访问这些文件,但是“fake/file.js”中的“expires”标头消失了。我究竟做错了什么?
example.com/original/file.js = 一年后到期
example.com/fake/file.js = 没有过期标头
解决方案 所有静态文件通常由 NGINX 处理,而不是 apache。所以在 apache 中为 javascript 设置这一行给它一个缓存。
标头集 Cache-Control "max-age=31556952, public"
RewriteRule 中的标志 [L] 必须停止 nginx 处理静态文件,并且忽略 ExpiresByType。
因为
/fake/file.js
不再是“静态文件”(它不存在),所以被传递到 Apache,在那里它被内部重写以获得所需的响应。text/javascript
可能不是您服务器上 JavaScript 响应的“正确”mime 类型。您需要确认您的服务器将这些响应发送回的 MIME 类型(即标头),但这些天Content-Type
通常会改为。application/javascript
换句话说:为了澄清,mod_expires
ExpiresByType
设置了Expires
和Cache-Control: max-age
HTTP 响应标头。Cache-Control: max-age
优先考虑所有现代浏览器。Expires
实际上仅用于旧版支持。该
L
标志只是停止 Apache 上重写引擎的当前传递。这些指令本身不会影响 Nginx(它似乎充当前端代理)。