情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

Nginxの変数をproxy_set_headerでApacheに渡してPHPで受け取る方法

Apache (5) Nginx (11) PHP (25) WordPress (76)

Nginxでモバイル・PC判定をして、キャッシュを別々に作っているのですが、その判定結果を、PHP(Apache上で動作)でも使いたくなりました。そこで、Nginxの設定ファイル内から、Apacheに情報を渡せるようにしてみたので、その方法をメモしておきます。

構成

サーバの構成は、WordPress(PHP)がApache上で動作しており、その前にリバースプロキシとしてNginxが動作しています。

そしてNginxでは、ユーザーエージェントでアクセス元を判定し、モバイル用キャッシュと、PC用キャッシュの2種類のキャッシュを同一URLに対して作るように設定しています(設定方法)。

問題点

しかし、バックエンドで動作しているApacheのPHPは、また別途モバイル用のページをNginxに返すか、PC用のページをNginxに返すかを独自に判定しています。

なので、Nginxのモバイル判定と、PHP(WordPress)側でのモバイル判定が食い違うことが有り、PCからアクセスしたのにモバイル用がキャッシュされていて、モバイル用しか表示されない、なんていうことがまれに発生します。

これを回避するには、判定を同じ基準にすればよいのですが、記述方法が違いますし、わざわざ全く別のところに同じ内容を書くのも管理が大変だしわかりにくいので、できればNginxの判定結果を、PHP側から利用したい、となるわけです

そこで、Nginxから、Apache上のPHPに情報を渡す方法を考えてみました

ヒントは、既に設定ファイル内に

実はヒントは有りました。

NginxからApacheに渡す情報として、「実際のIPアドレス」というものがあります。

どういうことかというと、Apacheと直接通信するのはNginxであるため、Apacheのログには、NginxのIPアドレスばかりが残るようなことになります。

これを避けるには、「実際のIPアドレス」を別途送信して上げる必要があります。

それを指定する設定が「proxy_set_header X-Real-IP $remote_addr; 」です。

これで、Apacheに送信するHTTPリクエストに「X-Real-IP」という追加ヘッダが登録されます(内容が$remote_addr)。

そしてApacheはこれを受け取って動作してくれているようです。つまり、なんとなく送り方はわかるけど、PHPからの受け取り方はさっぱりなところまでは、現状の設定ファイルを見て行けました。

手順

さて、では結局銅やったかを書きます。

Nginx側

まず、Nginxの設定ファイル(/)に、次の1行を追加しておきます。

追記した場所は、「location / {...}」の中で、proxy_set_header が既に複数並んでいる場所でした。

ここで、「$mobile」は、モバイルの場合は「"@mobile"」という文字列が格納されていて、PCの場合は空文字列になっています。

Apache(PHP)側

さて、この情報をどう受け取るかが問題なのですが、今回「X-Is-Mobile」というヘッダ名で追加したのですが、受け取るときには、「HTTP_X_IS_MOBILE」というヘッダ名で受け取ります

Nginxの記法と、実際のヘッダの名前表記が別のようで、頭に「HTTP_」をつけて、「X-Is-Mobile」を、すべて大文字にして、「-」を「_」に変更した文字列で、次のように受信します。

function my_wp_is_mobile() {
	$x_is_mobile = $_SERVER['HTTP_X_IS_MOBILE'];

	if ( $x_is_mobile == '@mobile' )
		return true;
	else
		return false;

ざっくりとわかりやすさ重視で書くとこうなります。

やはりポイントは、「$_SERVER['HTTP_X_IS_MOBILE']」で、Nginxから渡した「$mobile」という変数の中身を受け取っている点です。これで、Nginxの判定基準を利用したモバイル判定がPHP側で実現できました。

参考

コメント(0)

新しいコメントを投稿