WordPress でリダイレクトループってもはやあるある過ぎて・・・
「WordPress アドレス (URL)」と「サイトアドレス (URL)」を変えただけでもリダイレクトループにはまるケースがありますが、今回はまた別の要因。
Summary
- WordPressの記事投稿プレビューが見れなかった
- リバースプロキシかけてリクエストURI変えると事故りますよ注意してね
Details
プレビューが見れない
管理画面で記事を投稿する際、右カラムに「プレビュー」というボタンがあります。
ここを押した時、本来であれば現在投稿している記事のプレビューが見れるはずなのですが・・・
見れないと。Chrome の Network で見てみると、どうやらリダイレクトループしていると。
なんで?
あろうことか 301 リダイレクトをしてくれているので、301 で検索した所見事に引っかかりました。
446 $redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url );
447
448 if ( !$redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request
449 return false;
450
451 if ( $do_redirect ) {
452 // protect against chained redirects
453 if ( !redirect_canonical($redirect_url, false) ) {
454 wp_redirect($redirect_url, 301); // <= こいつ
455 exit();
456 } else {
457 // Debug
458 // die("1: $redirect_url<br />2: " . redirect_canonical( $redirect_url, false ) );
459 return false;
460 }
461 } else {
462 return $redirect_url;
463 }
どうも正規化をしてくれているはずの箇所で、どうも誤判定している?
しかしちょっと待て、ちょっと上を見てみると・・・
448 if ( !$redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request
449 return false;
ご丁寧に書いてくださってるではないか。
request_url
と redirect_url
がどっかのタイミングで別物になってるからいつまで経ってもここを抜けだせないのね。
原因を遡ると・・・
45 if ( !$requested_url ) {
46 // build the URL in the address bar
47 $requested_url = is_ssl() ? 'https://' : 'http://';
48 $requested_url .= $_SERVER['HTTP_HOST'];
49 $requested_url .= $_SERVER['REQUEST_URI'];
50 }
お前か。$request_url
を自動作成しやがって。
原因は?
リバースプロキシがそもそもの原因でした。
訳あってwebサーバA からプロキシかけてwebサーバB(WordPress)に飛ばしていたのですが、その際に rewrite かけて リクエストURI を変えてしまっていたのが問題。
という訳で、泣く泣く webサーバB 側でゴニョゴニョするハメに・・・。