Apache-2.2
如何向 apache 和 nginx 提供的所有 404 頁面添加無記憶體標頭?
我最近在切換到 Cloudflare 後遇到了一個問題,解決方案是基本上阻止 Cloudflare 記憶體 404 響應。
在我們的負載平衡多伺服器設置中,偶爾會發生 404,但它們很快被 rsync(通過 lsyncd)修復。在 Cloudflare 之前,對 404ed 文件的重新請求將很快變成 200,因為 rsync 完成了它的工作。
但是,由於 Cloudflare 根據記憶體標頭記憶體所有數據,並且 apache 和 nginx 都沒有為 404 發送 no-cache 標頭,因此 Cloudflare 最終會記憶體 404 響應一段時間。
我一直在尋找一種解決方案,可以在 apache 和 nginx 中為 404 全域添加這樣的標頭(全域,對於所有託管域),但到目前為止都是空白的。
任何人都可以幫忙嗎?
謝謝你。
您不能使用 error_page 指令,然後使用添加的標頭單獨處理該位置嗎?
例如在 Nginx 中:
server { ... error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; add_header Cache-Control "no-cache" always; } }
在 apache 2.4 中,您可以嘗試以下操作:
FileETag None <IfModule mod_headers.c> Header always unset ETag "expr=%{REQUEST_STATUS} == 404" Header always set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" "expr=%{REQUEST_STATUS} == 404" Header always set Pragma "no-cache" "expr=%{REQUEST_STATUS} == 404" Header always set Expires "Wed, 11 Jan 1984 05:00:00 GMT" "expr=%{REQUEST_STATUS} == 404" </IfModule>
這
always
很重要,因為這是一個:您正在向本地生成的非成功(非 2xx)響應(例如重定向)添加標頭,在這種情況下,最終響應中僅使用始終對應的表。
<FilesMatch>
您說的是所有 404,但為了完整參考,當然將其包裝在 a 中或<LocationMatch>
限制範圍 可能是有意義的。我相信這是 apache 2.4 中的一項新功能,因為
expr
在 mod_headers 文件的 2.2 版本中沒有使用條件。
curl -I [foo]
沒有這個配置的測試:HTTP/1.1 404 Not Found Date: Thu, 24 May 2018 17:44:29 GMT Server: Apache/2.4.18 (Ubuntu) Content-Type: text/html; charset=iso-8859-1
curl -I [foo]
使用此配置進行測試:HTTP/1.1 404 Not Found Date: Thu, 24 May 2018 17:44:42 GMT Server: Apache/2.4.18 (Ubuntu) Cache-Control: max-age=0, no-cache, no-store, must-revalidate Pragma: no-cache Expires: Wed, 11 Jan 1984 05:00:00 GMT Content-Type: text/html; charset=iso-8859-1
資料來源: