VPN越しにルータのWEB管理画面を参照したかったので、nginxでリバースプロキシの設定をした
+----+ VPN +------+ +--------+ | PC +----------------+ 装置 +----------------+ ルータ | +----+ tap +------+ eth1 +--------+ 192.168.36.x 192.168.36.5 192.168.10.x 192.168.10.1 http://192.168.36.5:8001/ ↓ http://192.168.10.1/
/etc/nginx/conf.d/proxy.conf を追加し、nginxを再起動
server { listen 8001; proxy_set_header Host $proxy_host; # ←無くてもいい location / { proxy_pass http://192.168.0.1; proxy_redirect default; } }
I-ODATAのルータに接続する際、proxy_set_headerで下手にHostを設定するとリダイレクトがループしてしまう現象に悩まされた。
# proxy_set_header Host $host; # NG # proxy_set_header Host $host:$proxy_port; # NG proxy_set_header Host $proxy_host; # OK (というか、これがデフォルト設定)
それぞれの変数の実際の値を調べてみる
proxy_set_header HOGE_host $host; # proxy_set_header HOGE_port $port; # こんな変数は無い proxy_set_header HOGE_proxy_host $proxy_host; proxy_set_header HOGE_proxy_port $proxy_port; proxy_set_header HOGE_http_host $http_host; proxy_set_header HOGE_http_port $http_port; # なぜかリクエストヘッダに無い
これでリクエストヘッダを見ると次のようになる
HOGE_host: 192.168.36.5 HOGE_proxy_host: 192.168.10.1 HOGE_proxy_port: 80 HOGE_http_host: 192.168.36.5:8001
サーバ側からしたら自分のホスト名は192.168.10.1なので、それをもとにHTML内のURIを生成したりしてるんだろう、たぶん。
nginxの仕様によると、$proxy_host はポート80以外のときはポート番号も入ってくれるらしい。