それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

nginx で proxyPassReverse的なのを実現する。

apache のproxyPassReverseって便利だよね。

とくに静的ページを作るのに便利。記事公開するだけのSPAなんぞいらねーよね。ってとき便利

でもnginx で出来ない。→ 置換すればできるよ。

URIディレクトリを修正する方法の例

プロキシリクエストの結果を書き換えられるので、それを仕込んで見る。

応答は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 で検索したときに、でてこなかったので書き換え