Mod-Rewrite

帶標誌的重寫規則大號大號L停止記憶體?

  • June 28, 2021

我將伺服器管理軟體 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”

旗幟

$$ L $$在 RewriteRule 中必須停止 nginx 處理靜態文件,並且忽略 ExpiresByType。

為什麼靜態文件根本不被 nginx 處理?

因為/fake/file.js不再是“靜態文件”(它不存在),所以被傳遞到 Apache,在那裡它被內部重寫以獲得所需的響應。

ExpiresByType text/javascript A31556952

text/javascript可能不是您伺服器上 JavaScript 響應的“正確”mime 類型。您需要確認您的伺服器將這些響應發送回的 MIME 類型(即標頭),但這些天Content-Type通常會改為。application/javascript換句話說:

ExpiresByType application/javascript A31556952

為了澄清,mod_expiresExpiresByType設置了Expires Cache-Control: max-ageHTTP 響應標頭。Cache-Control: max-age優先考慮所有現代瀏覽器。Expires實際上僅用於舊版支持。

旗幟

$$ L $$在 RewriteRule 中必須停止 nginx 處理靜態文件

L標誌只是停止 Apache 上重寫引擎的目前傳遞。這些指令本身不會影響 Nginx(它似乎充目前端代理)。

引用自:https://serverfault.com/questions/1068040