nginxのsub_filterで文字列が置換されない

サーバー

記事の内容

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>
タイトルとURLをコピーしました