带标志 [L] 的 RewriteRule 是否停止缓存?

带标志 [L] 的 RewriteRule 是否停止缓存?

我使用带有 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-ageHTTP 响应标头。Cache-Control: max-age在所有现代浏览器上优先。Expires实际上仅用于旧版支持。

RewriteRule 中的标志 [L] 必须停止 nginx 处理静态文件

L标志只是停止 Apache 上重写引擎的当前传递。这些指令本身不会影响 Nginx(它似乎充当了前端代理)。

相关内容