wordpressとリバースプロキシの相性の悪さったら・・・・



wordpress×リバースプロキシでは管理画面に問題が出る

サービスサイトでは、node.jsとwordpressをatosaku.comからアクセスさせるために、リバースプロキシを用いています。
リバースプロキシを設定後、管理画面のディレクトリの設定で少しハマっている方に向けて、書かせて頂きます。

※以下のキーワードをクリックして会員登録すると、「後で検索」ができます。
もし、お時間があればぜひお試し下さい!

node.js reverse proxy
リバースプロキシとは
リバースプロキシ リダイレクト 違い

結論

ディレクトリで振り分ける場合、wp-configに以下のように書く事で、管理画面の問題は消えます。

$_SERVER['HTTP_HOST'] = 'atosaku.com/a';
$_SERVER['REQUEST_URI'] = "/a".$_SERVER['REQUEST_URI'];

今回対象とする構成

http://atosaku.com/ → node.js http://localhost:9000/
http://atosaku.com/a/ → wordpress http://192.168.1.5:9000/

今回は上記のようにPHPとnode.jsで2つに別れているサーバを、ディレクトリで分けるだけでアクセスさせたいという要件でした。

問題は管理画面全般で起きる

今回、ユーザ側には問題はほとんど起きませんでした。
しかし、管理画面で結構不便な問題が起きます。

・管理画面でログインできない場合がある。

http://atosaku.com/a/管理画面URI/にアクセスすれば、http://wordpress/管理画面URIとなるため、ロードされます。
しかし、ちょっと打ち間違えたりすると以下のURLになり、

http://atosaku.com/a/ログイン画面?redirect_uri=http://atosaku.com/管理画面URI

結果、http://atosaku.com/管理画面URI/にリダイレクトされます。

つまり、このゾーンはリバースプロキシに記述していないため、node.jsでは404になります。
この場合、redirect_uriを外してログインすれば大丈夫なのですが、そんなのを毎回やるのは面倒です。
直しましょう。

・メディアなどでページングが効かなくなる

ページングのリンクを踏むと、ログインできない状況と同様、
http://atosaku.com/管理画面URI/にリダイレクトされ、node.jsで404になります。
_wp_http_refererという値で制御しているようです。

なぜ、前述のコードで解決するか?

URIがwordpress内では管理画面URIにアクセスしているため、全てのURIに”/a”を挿入する事で直すことができます。
そのためのコードが前述の2行のコードです。
管理画面uri→/a/管理画面uriに修正され、結果全て正しく動作します。

参考サイト

http://wordpress.org/support/topic/wordpress-behind-reverse-proxy-1

僕の環境では動作しなかった環境

$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];


wordpress×リバースプロキシでは管理画面に問題が出る

サービスサイトでは、node.jsとwordpressをatosaku.comからアクセスさせるために、リバースプロキシを用いています。
リバースプロキシを設定後、管理画面のディレクトリの設定で少しハマっている方に向けて、書かせて頂きます。

※以下のキーワードをクリックして会員登録すると、「後で検索」ができます。
もし、お時間があればぜひお試し下さい!

node.js reverse proxy
リバースプロキシとは
リバースプロキシ リダイレクト 違い

結論

ディレクトリで振り分ける場合、wp-configに以下のように書く事で、管理画面の問題は消えます。

$_SERVER['REQUEST_URI'] = "/a".$_SERVER['REQUEST_URI'];

今回対象とする構成

http://atosaku.com/ → node.js http://localhost:9000/
http://atosaku.com/a/ → wordpress http://192.168.1.5:9000/

今回は上記のようにPHPとnode.jsで2つに別れているサーバを、ディレクトリで分けるだけでアクセスさせたいという要件でした。

問題は管理画面全般で起きる

今回、ユーザ側には問題はほとんど起きませんでした。
しかし、管理画面で結構不便な問題が起きます。

・管理画面でログインできない場合がある。

http://atosaku.com/a/管理画面URI/にアクセスすれば、http://wordpress/管理画面URIとなるため、ロードされます。
しかし、ちょっと打ち間違えたりすると以下のURLになり、

http://atosaku.com/a/ログイン画面?redirect_uri=http://atosaku.com/管理画面URI

結果、http://atosaku.com/管理画面URI/にリダイレクトされます。

つまり、このゾーンはリバースプロキシに記述していないため、node.jsでは404になります。
この場合、redirect_uriを外してログインすれば大丈夫なのですが、そんなのを毎回やるのは面倒です。
直しましょう。

・メディアなどでページングが効かなくなる

ページングのリンクを踏むと、ログインできない状況と同様、
http://atosaku.com/管理画面URI/にリダイレクトされ、node.jsで404になります。
_wp_http_refererという値で制御しているようです。

なぜ、前述のコードで解決するか?

URIがwordpress内では管理画面URIにアクセスしているため、全てのURIに”/a”を挿入する事で直すことができます。
そのためのコードが前述の2行のコードです。
管理画面uri→/a/管理画面uriに修正され、結果全て正しく動作します。

参考サイト

http://wordpress.org/support/topic/wordpress-behind-reverse-proxy-1

僕の環境では動作しなかった環境

$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];

[sc:採用情報へのリンク]
カテゴリー: node.js, wordpress   作成者: 星野 善彦 パーマリンク

星野 善彦 の紹介

node.js / Objective-Cにて、アトサクという検索管理サービスを作っています。 本ブログでは、トラブルシューティングとともに、参考になるキーワードを紹介します。 もし、気になるキーワードがあれば、アトサクに追加して頂ければ幸いです。