トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

mod_rewrite

URL書換エンジン

RewriteCond

RewriteCond %{HOGE} !^$

とかいう条件があるとき、HOGEに設定できる変数名は

ENV:FOO_BAR
SSL:FOO_BAR

HTTP:FOO_BAR
LA-U:FOO_BAR
LA-F:FOO_BAR

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

になっていた。
http-2.2.13のmod_rewrite.cから拾っているので、それより前のバージョンでは違いがあるかもしれないけど...

# X-Forwarded-Forがあるとき(PROXY経由か)
RewriteCond %{HTTP:X-Forwarded-For} !^$

QUERY_STRING

URLが

http://foo.bar.com/?x=123

でドキュメントルートの.htaccessに

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} x=([0-9]+)
RewriteRule index.php hoge.php?y=%1 [R=301,L]

とした場合、

http://foo.bar.com/hoge.php?y=123

にリダイレクトされる。

このとき

http://foo.bar.com/?x=123&y=456&z=789
↓
http://foo.bar.com/hoge.php?y=123

となり他のクエリーストリングが引き継がれない。

かといって下記のようにすると

http://foo.bar.com/?x=123&y=456&z=789
↓
RewriteRule index.php hoge.php?y=%1 [R=301,L,QSA]
↓
http://foo.bar.com/hoge.php?y=123&x=123&y=456&z=789
↓
hoge.php
Array ( [y] => 456 [x] => 123 [z] => 789 )

となってしまい、yは後から設定される456が有効となってしまう。

注意点

httpd.confに記述した場合と.htaccessに記述した場合でRewiteRuleの条件が変わってくる。

教えて!Watch:mod_rewriteの変換について

グローバルセッションの場合は、グローバル故に^/からの絶対参照にして、<Directory>や.htaccessの場合はその設定、置いた場所によって相対参照になる模様。
またReriteBaseも絡んでくる。

テストは

自分の環境でマッチするかどうかは DocumentRootに例えば test.htm などのFileを置き
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test.htm
RewriteRule ^(.*)$ /test.htm?$1 [R]
と記述してhttp://hoge.example.com/a.htmなどにアクセスし その結果が
http://hoge.example.com/test.htm?a.htm <= こうなれば ^/ にマッチしない
http://hoge.example.com/test.htm?/a.htm <= ^/ にマッチする

とな。

.htaccessでmod_rewriteを使用するにあたり、httpd.confにて該当するディレクトリに

Options FollowSymLinks 

が設定されていないと権限エラーになる。

 正規表現について

mod_rewirteで使える正規表現はApacheのバージョンで違うので注意。

Wikipedia 正規表現
http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE

参考

杉浦とホームページ製作 URLを書き換えろ! Apache Rewrite 機能の応用
http://www.nurs.or.jp/~sug/homep/rewrite/rewrite15.htm#sec3