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'];
これで実際のアドレスを拾わせることができるようになった。