記事の内容
nginx.confを見直したらそれまでnginx sub_filterで置換していた文字列が置換されなくなったので調査したときのメモ。
解決策
/etc/nginx/nginx.conf
locationディレクティブでsub_filterとともにAccept-Encodingリクエストヘッダを空にし、Webサーバーによるコンテンツの圧縮を無効化する。
http {
server {
location / {
...
sub_filter 'ec2' 'GCE';
sub_filter 'AWS' 'GCP';
sub_filter_once off;
#Accept-Encodingヘッダの中身を空にする
proxy_set_header Accept-Encoding "";
...
原因
コンテンツがApacheでgzip圧縮され、テキストがリバースプロキシのサブフィルタへ指定したパターンに一致しなくなったため。
発生条件
- ブラウザからのリクエスト時にAccept-Encodingで圧縮方式が指定されている
- Webサーバー側も指定されたコンテンツ圧縮に対応している
発生イメージ
Accept-Encodingに圧縮方式が複数指定されている場合は先に列挙されたものが優先される。
サーバーが選択した圧縮アルゴリズムは Content-Encoding レスポンスヘッダーでクライアントに通知される。
構成
- nginx : リバースプロキシ
- Apache : Webサーバー
/etc/nginx/nginx.conf
http {
server {
location / {
...
sub_filter 'ec2' 'GCE';
sub_filter 'AWS' 'GCP';
sub_filter_once off;
...
/etc/apache2/mods-available/deflate.conf
対象Webサーバーではコンテンツをgzip圧縮するmod_deflateが有効になっている。
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/wasm
AddOutputFilterByType DEFLATE application/xml
</IfModule>
</IfModule>