LoginSignup
19

More than 5 years have passed since last update.

mod_rewriteでApache環境変数を一時変数として利用する

Last updated at Posted at 2014-01-20

はじめに

Apacheのmod_rewriteの設定をhttpd.confや.htaccessへ記載する際、ちょっと込み入ったことをしようとすると記載内容が複雑になり可読性が落ちてしまいます。

そもそもmod_rewriteはプログラマルな処理には向いていないのですが、一時変数としてApacheの環境変数を利用することで可読性を上げることができますので、記載例を紹介します。

例①:スマートフォンまたはFacebookクローラからのアクセスである場合は、それぞれ表示するロゴや適用するCSSを変更する

.htaccess(またはhttpd.conf)
RewriteEngine on

RewriteRule .* - [E=X_ACCESS_DEVICE:NULL]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^NULL$
RewriteCond %{HTTP_USER_AGENT} Android [NC]
RewriteRule .* - [E=X_ACCESS_DEVICE:SMARTPHONE]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^NULL$
RewriteCond %{HTTP_USER_AGENT} iPhone [NC,OR]
RewriteCond %{HTTP_USER_AGENT} iPod [NC]
RewriteRule .* - [E=X_ACCESS_DEVICE:SMARTPHONE]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^NULL$
RewriteCond %{HTTP_USER_AGENT} facebookexternalhit
RewriteRule .* - [E=X_ACCESS_DEVICE:FACEBOOK]

...

RewriteCond %{ENV:X_ACCESS_DEVICE} ^SMARTPHONE$
RewriteRule ^img/logo\.png /img/logo_sp.png [L]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^FACEBOOK$
RewriteRule ^img/logo\.png /img/logo_fb.png [L]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^SMARTPHONE$
RewriteRule ^css/common\.css /css/common_sp.css [L]

RewriteCond %{ENV:X_ACCESS_DEVICE} ^FACEBOOK$
RewriteRule ^css/common\.css /css/common_fb.css [L]

上記の例では、環境変数 X_ACCESS_DEVICE を一時変数として利用しています。
この例ではそれほど環境変数を利用する恩恵はないかもしれませんが、例えばユーザエージェントにより様々なコンテンツを表示しわけるといった場合、ユーザエージェントの判定を一箇所にまとめることが出来ます。
※環境変数名の頭に X_ を付与してるのは、Apache標準の環境変数でなくサードパーティの開発者が設定した環境変数であることを明示する作法です。

FacebookクローラはFacebookでURLをシェアした際に対象サイトのURLアクセスしてくるので、OGP対応として専用の画像やCSSを適用する場合は上記のようにに対応が可能です(OGP対応についてはまた別のエントリで紹介します)。

例②:静的リソースに対するアクセスの場合は、ローカルサーバに無い画像をAmazon S3 から取得する(リバースプロキシ)

.htaccess(またはhttpd.conf)
RewriteEngine on

RewriteRule .* - [E=X_IS_STATIC_CONTENT:0]

RewriteCond %{REQUEST_URI} ([^\]+\.css)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.js)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.html)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.json)$ [OR]
RewriteCond %{REQUEST_URI} ([^\]+\.csv)$
RewriteRule .* - [E=X_IS_STATIC_CONTENT:1,E=X_STATIC_FILE_NAME:%1]

RewriteCond %{ENV:X_IS_STATIC_CONTENT} ^1$
RewriteCond %{DOCUMENT_ROOT}/resource/%{ENV:X_STATIC_FILE_NAME} !-f
RewriteRule ^resource/(.+)$ http://hoge.s3-website-ap-southeast-1.amazonaws.com/resource/$1 [P,L]

※最終行について、httpd.confに記載する場合は ^/resource/.. のように頭に / が必要です。

上記の例では、環境変数 X_IS_STATIC_CONTENT および X_STATIC_FILE_NAME を一時変数として利用しています。
ローカルサーバに画像が存在すればその画像を、存在しなければ S3 から画像を取得(リバースプロキシ)します。

mod_rewriteでのプロキシについては、また別のエントリで紹介します。

参考URL

Apache2.2のmod_rewrite公式ドキュメント

ほか

サンプルの動作検証があまり十分でないので^^; 動かないなどありましたらコメントください。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19