Apache-2.2

如何向 apache 和 nginx 提供的所有 404 頁面添加無記憶體標頭?

  • May 24, 2018

我最近在切換到 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

資料來源:

http://httpd.apache.org/docs/current/mod/mod_headers.html

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