![带标志 [L] 的 RewriteRule 是否停止缓存?](https://linux22.com/image/768002/%E5%B8%A6%E6%A0%87%E5%BF%97%20%5BL%5D%20%E7%9A%84%20RewriteRule%20%E6%98%AF%E5%90%A6%E5%81%9C%E6%AD%A2%E7%BC%93%E5%AD%98%EF%BC%9F.png)
我使用带有 apache 和 nginx 的服务器管理软件 plesk。我在 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。
答案1
为什么静态文件根本不被 nginx 处理?
因为/fake/file.js
不再是“静态文件”(它不存在),所以被传递到 Apache,在那里它被内部重写以获得所需的响应。
ExpiresByType text/javascript A31556952
text/javascript
可能不是 JavaScript 响应的“正确” mime 类型你的服务器Content-Type
。您需要确认您的服务器随这些响应发送回的mime 类型(即标头),但application/javascript
现在通常会这样。换句话说:
ExpiresByType application/javascript A31556952
需要澄清的是,mod_expiresExpiresByType
设置了Expires
和 Cache-Control: max-age
HTTP 响应标头。Cache-Control: max-age
在所有现代浏览器上优先。Expires
实际上仅用于旧版支持。
RewriteRule 中的标志 [L] 必须停止 nginx 处理静态文件
该L
标志只是停止 Apache 上重写引擎的当前传递。这些指令本身不会影响 Nginx(它似乎充当了前端代理)。