WordPressでリバースプロキシを介すると301ループする/X-Forwarded-Forが反映されない
x-forwarded-for
- TOP
- Old Archives
- WordPressでリバースプロキシを介すると301ループする/X-Forwarded-Forが反映されない
301ループ
リバースプロキシ(DeleGate)の向こうにあるWordPressが301ループするという問題だ。
これはWordPressのサイトアドレスをDeleGateがアクセスするものにしておけば問題は発生しない。 ただし、リバースプロキシを置く以上、バックエンドのアドレスは隠蔽したいわけで、これは望ましくない。
一見、MOUNT
オプションとしてvhost
でなくnvhost
を使用することで解決できるかに思えたが、実際は解決しない。
問題がHost
ヘッダにあるのは間違いない。
調べると、requested_url
とredirect_url
が異なる場合に301でリダイレクトする、ということがわかる。
DeleGateはどうしてもHost
ヘッダは自分で生成してしまう(スルーしてくれない)ため、Host
を元に生成されるrequested_url
と、サイトアドレスを元に生成されるredirect_url
が一致しない。
そこで、起動設定に以下を加えた
HTTPCONF="add-qhead:X-Forwarded-Host:%I"
だが、WordPressがX-Forwarded-Host
を拾ってくれないのか、それともjournal.reasonset.net:80
とポートを含めるためなのか、これだけでは動作しない。
そこで、wpconfig.php
に以下の記述を加えた
$_SERVER['HTTP_HOST'] = "journal.reasonset.net";
Host
が違う場合は無視することになってしまうが、まぁ良いとしよう。
ちなみに、X-Forwarded-Host
の値を代入しても、やはりポートを含むためなのか、動作しない。
X-Forwarded-For
DeleGateでX-Forwarded-For
を設定する方法は
HTTPCONF="add-qhead:X-Forwarded-For:%a"
であるが、これで正しく動作しない。
X-Forwarded-For
の値をとるとどうしてもDeleGateの値になってしまう。
どうも、ブログを設置しているXDomain側もリバースプロキシをもっていて、そこでX-Forwarded-Forを設定しているようだ。
仕方ないので、別の値も与えておく
HTTPCONF="add-qhead:X-Forwarded-Delegate-For:%a"
wpconfig.php
でこちらを使わせる
$_SERVER['HTTP_X_FORWAREDED_FOR'] = $_SERVER['HTTP_X_FORWARDED_DELEGATE_FOR'];
これで実際のアドレスを拾わせることができるようになった。