Cloudflareに切り替えた後、最近問題が発生しました。解決策は、基本的にCloudflareが404応答をキャッシュしないようにすることです。
負荷分散されたマルチサーバー設定では、404が時々発生しますが、rsyncによって(lsyncdを介して)すぐに修正されます。 Cloudflareの前は、rsyncがその仕事をするので、404edファイルへの再リクエストはすぐに200になります。
ただし、Cloudflareはキャッシュヘッダーに基づいてすべてのデータをキャッシュし、Apacheもnginxも404のキャッシュなしヘッダーを送信しないため、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;
}
}
あなたもこれをこのように行うことができます:
map $status $cache_header {
default <for_other_codes>;
404 "no-cache";
}
server {
[ ... ]
add_header "Cache-Control" $cache_header 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以外)の応答にヘッダーを追加します。この場合、最終的な応答では、常に対応するテーブルのみが使用されます。
すべての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
出典:
問題についての私の5セント-
PHPプロジェクトには404ページしかないので、PHPレベルPHP header( ) 関数