apache のproxyPassReverseって便利だよね。
とくに静的ページを作るのに便利。記事公開するだけのSPAなんぞいらねーよね。ってとき便利
でもnginx で出来ない。→ 置換すればできるよ。
プロキシリクエストの結果を書き換えられるので、それを仕込んで見る。
応答はsub_filter で置換できる。
location ~/blog/(.*) { # rewrite ^ $1 break; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; set $nocache 0; if ($arg_filter_distance = "") { set $nocache 1; } proxy_cache_bypass $nocache; proxy_no_cache $nocache; proxy_pass http://127.0.0.1:1234/$1; sub_filter '/static' "${uri}static"; sub_filter '/task' "${uri}task/"; sub_filter_once off; }
ポイント
ここで、proxy 取得したHTMLの「コンテンツを書き換え(sub_filter)」ている。
sub_filter '/static' "${uri}static"; sub_filter '/task' "${uri}task/";
ただし、JSにかかれてJSでLocationを管理されると手出しができないので注意。
HTML ファイル以外を書き換えたい。
「sub_filter 」はContent-Typeを見ていて、Content-Typeがtext/html 以外を編集しない。
octet-stream や video を書き換えても徒労に終わるからだ。ただm3u8やjs など文字列は書き換えても良い。
その場合は、Content-Typeを明示する
sub_filter_types application/x-mpegURL; ## 複数書くときはスペースで列挙 sub_filter_types text/html application/x-mpegURL; ## ワイルドカードも sub_filter_types text/* application/*;
このように、sub_filter_types を使って subfilter が動作するファイルを追加する必要がある。
複数のタイプの書き方やワイルドカードの例については、本家のドキュメントに具体的な指示がないので、たぶんnginx 一般の書き方なんだろう。
どういうときに使えるのか
サブディレクトリに非対応なWebアプリケーションを無理やりサブディレクトリで展開するのに便利。
サブディレクトリにしたほうが便利なアプリケーションがある。たとえば、複数のブログとか。たとえば、JiraとConfulenceとか。
2023-09-28
sub_filter で検索したときに、でてこなかったので書き換え