web-dev-qa-db-ja.com

Apacheとnginxが提供するすべての404ページにキャッシュなしヘッダーを追加するにはどうすればよいですか?

Cloudflareに切り替えた後、最近問題が発生しました。解決策は、基本的にCloudflareが404応答をキャッシュしないようにすることです。

負荷分散されたマルチサーバー設定では、404が時々発生しますが、rsyncによって(lsyncdを介して)すぐに修正されます。 Cloudflareの前は、rsyncがその仕事をするので、404edファイルへの再リクエストはすぐに200になります。

ただし、Cloudflareはキャッシュヘッダーに基づいてすべてのデータをキャッシュし、Apacheもnginxも404のキャッシュなしヘッダーを送信しないため、Cloudflareは404応答をしばらくキャッシュします。

私は、Apacheとnginxの両方で404のヘッダーをグローバルに追加するソリューションを探していましたが(これはすべてのホストドメインに対して)、これまでのところ空白です。

誰か助けてもらえますか?

ありがとうございました。

9

Error_pageディレクティブを使用して問題を解決し、ヘッダーを追加して場所を個別に処理することはできませんか?

例:Nginx:

    server {
      ...
      error_page 404 /404.html;
      location = /404.html {
        root   /usr/share/nginx/html;
        add_header Cache-Control "no-cache" always;
      }
    }
6
jimmiw

あなたもこれをこのように行うことができます:

map $status $cache_header {
    default <for_other_codes>;
    404     "no-cache";
}


server {

    [ ... ]

    add_header "Cache-Control" $cache_header always;

}
5
Xavier Lucas

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以外)の応答にヘッダーを追加します。この場合、最終的な応答では、常に対応するテーブルのみが使用されます。

すべての404を言いましたが、もちろん完全な参照のために、それを<FilesMatch>または<LocationMatch>スコープを制限します。

expr条件文を使用することはmod_headersドキュメントのバージョン2.2にはないため、これはApache 2.4の新機能だと思います。

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

3
cayleaf

問題についての私の5セント-

PHPプロジェクトには404ページしかないので、PHPレベルPHP header( ) 関数

0
Nick