mod_rewrite サンプル集/楽

mod_rewrite サンプル集

mod_rewrite はすげー色んなことができて楽しい。
でもけっこう難しい。
そこで、オイラ用メモで簡単なサンプル集をば。

シンプルなリダイレクト例

/hoge/ を /fuga/ に rewrite(リダイレクト)する。

RewriteEngine on
RewriteRule ^/hoge/$ /fuga/

/hoge/ 以下を /fuga/ 以下にまとめて rewrite(リダイレクト)する。

RewriteEngine on
RewriteRule ^/hoge/(.*)$ /fuga/$1

/hoge/ 以下で末尾が .jpg のリクエストのみを /fuga/ 以下に rewrite(リダイレクト)する。

RewriteEngine on
RewriteRule ^/hoge/(.*.jpg)$ /fuga/$1

/hoge/ 以下で末尾が .jpg か .gif のリクエストのみを /fuga/ 以下に rewrite(リダイレクト)する。

RewriteEngine on
RewriteRule ^/hoge/(.*).(jpg|gif)$ /fuga/$1.$2

/cgi-bin/hoge/fuga を /cgi-bin/example.cgi?q=hoge&opt=fuga に rewrite(リダイレクト)(いわゆる、動的アドレスを静的アドレスに変換するってやつ)

RewriteEngine on
RewriteRule ^/cgi-bin/([0-9A-Za-z]+)/([0-9A-Za-z]+)$ /cgi-bin/example.cgi?q=$1&opt=$2


リダイレクト時のブラウザのURL欄

mod_rewrite で rewrite(リダイレクト)処理を行ったとき、以下のようにサーバパスで rewrite(リダイレクト)させると、ブラウザのURL欄は書き換わらない。

RewriteEngine on
RewriteRule ^/hoge/$ /fuga/

例えば、
http://www.example.com/hoge/ にアクセスすると、
http://www.example.com/fuga/ の中身が、
URL欄は http://www.example.com/hoge/ のまま表示される。

しかし、以下の例では、リダイレクトと同時にURL欄が書き換わる。

RewriteEngine on
RewriteRule ^/hoge/$ /fuga/ [R=301]

RewriteEngine on
RewriteRule ^/hoge/$ /fuga/ [R=302]

RewriteEngine on
RewriteRule ^/hoge/$ http://www.example.com/fuga/

最後の URL にリダイレクトさせるパターンは、同じサーバ内の URL であっても、飛び先を URL で記述するとブラウザのURL欄が書き換わります
同一サーバ内であれば、URLにリダイレクトさせると無駄にログも増えるのであまりオススメしません。


%2F問題

Apache1.X 系で mod_rewrite を使う場合、URLに「%2F」が含まれると思い通りに動作しない問題があります。
(Apache2.X 系でも同様ですが、Apache2.0.46 以降では「AllowEncodedSlashes On」により回避できます。)

例えば、以下のような書き換えを記述したとします。

RewriteEngine on
RewriteRule ^/keyword/(.*)$ /cgi-bin/script.cgi?k=$1

想定としては、
http://www.example.com/keyword/hogefuga というアクセスに対して
http://www.example.com/cgi-bin/script.cgi?k=hogefuga の結果を返します。

hogefuga の部分が色々と変化するわけです。

この際、
http://www.example.com/keyword/hogefuga/hage
http://www.example.com/cgi-bin/script.cgi?k=hogefuga/hage となりますが、

http://www.example.com/keyword/hogefuga%2Fhage
http://www.example.com/cgi-bin/script.cgi?k=hogefuga%2Fhage とならず、404エラーになります

直接、
http://www.example.com/cgi-bin/script.cgi?k=hogefuga%2Fhage にアクセスするとこの問題は起きません。

先にも書きましたが、Apache2.0.46 以降では httpd.conf に「AllowEncodedSlashes On」を記述することにより回避できます。
しかし、Apache1.X の環境ではなかなか回避できずにはまる要素だと思います。


アクセスを拒否する

どこかにリダイレクトするのではなく、特定のアクセスにエラーを返せます。

.htaccess へのアクセスを拒否する。

RewriteEngine On
RewriteRule .htaccess – [F]

/hoge/ 以下へのアクセスに 403 Forbidden を返します。

RewriteEngine On
RewriteRule ^/hoge/.* [F]

/hage/ 以下へのアクセスに 410 Gone を返します。

RewriteEngine On
RewriteRule ^/hage/.* [G]


複数の RewriteRule

RewriteRule は複数かけます。

/hoge/ 以下を /fuga/ 以下にリダイレクとした上に /fuga/hage/ 以下のものは /foo/ 以下にリダイレクトする。

RewriteEngine On
RewriteRule ^/hoge/(.*) /fuga/$1
RewriteRule ^/fuga/hage/(.*) /foo/$1

上の例で、/hoge/ 以下を /fuga/ 以下にリダイレクとさせた時点で処理を終わらせる、つまり次のリダイレクトを実行させないようにするには [L] を付加します

RewriteEngine On
RewriteRule ^/hoge/(.*) /fuga/$1 [L]
RewriteRule ^/fuga/hage/(.*) /foo/$1


RewriteRule のオプション

これ以外にもいろいろありますが。

HTTPステータスコードを吐く [R=ステータスコード]

RewriteEngine On
RewriteRule ^/hoge/(.*) /fuga/$1 [L,R=301]
RewriteRule ^/fuga/hage/(.*) /foo/$1

大文字、小文字を区別しない [NC]

RewriteEngine On
RewriteRule ^/hoge/(.*) /fuga/$1 [NC,L]
RewriteRule ^/fuga/hage/(.*) /foo/$1


ある条件が揃ったらリダイレクト

RewriteCond を使えば、ある条件に合致したときだけリダイレクトするということも、もちろん可能です。

HTTP_HOST が www.example.com だったら RewriteRule を適用する。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule ^/(.*) /$1

HTTP_HOST が www.example.com じゃなかったら RewriteRule を適用する。

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.example.com$
RewriteRule ^/(.*) /$1

HTTP_HOST が www.example.com で HTTP_USER_AGENT に MSIE が含まれていたら RewriteRule を適用する。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteCond %{HTTP_USER_AGENT} MSIE
RewriteRule ^/(.*) /$1

RewriteCond を複数並べると AND でつながっていく。OR にしたい場合は [OR] をつける

HTTP_HOST が www.example.com であるか、または HTTP_USER_AGENT に MSIE が含まれていたら RewriteRule を適用する。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com$ [OR]
RewriteCond %{HTTP_USER_AGENT} MSIE
RewriteRule ^/(.*) /$1

RewriteCond の条件で大文字、小文字を区別しない場合は [NC] をつける。

HTTP_USER_AGENT に MSIE や msie や MsIe や MSiE などが含まれていたら RewriteRule を適用する。

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} MSIE [NC]
RewriteRule ^/(.*) /$1

RewriteCond で対象となる変数には以下のようなものがあります。

HTTP_USER_AGENT / HTTP_REFERER / HTTP_COOKIE / HTTP_FORWARDED / HTTP_HOST / HTTP_PROXY_CONNECTION / HTTP_ACCEPT
REMOTE_ADDR / REMOTE_HOST / REMOTE_USER / REMOTE_IDENT / REQUEST_METHOD / SCRIPT_FILENAME / PATH_INFO / QUERY_STRING / AUTH_TYPE
DOCUMENT_ROOT / SERVER_ADMIN / SERVER_NAME / SERVER_ADDR / SERVER_PORT / SERVER_PROTOCOL / SERVER_SOFTWARE
TIME_YEAR / TIME_MON / TIME_DAY / TIME_HOUR / TIME_MIN / TIME_SEC / TIME_WDAY / TIME
API_VERSION / THE_REQUEST / REQUEST_URI / REQUEST_FILENAME / IS_SUBREQ

以上、かんたんな mod_rewrite サンプル集でした。

ここに挙げた機能だけでもいろいろ遊べますが、環境変数を設定したり、外部スクリプトを利用して書き換え処理をしたり、などといったもっと複雑な処理もmod_rewriteでは可能です。
いろいろ試してアーミーナイフの達人目指してください。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中