Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

はじめに

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公式ドキュメント

ほか

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away