2016年1月14日木曜日

Apatche mod_rewirteモジュール サンプル

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

/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にリダイレクトさせると無駄にログも増えるのであまりオススメしません。

アクセスを拒否する

どこかにリダイレクトするのではなく、特定のアクセスにエラーを返せます。
.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_SUBRE

参考ページ

0 件のコメント:

コメントを投稿