mod_rewrite まとめ
- 準備
SSLProxyEngine On #httpsのURLに転送ではなくてリバースプロキシーする場合には、Onにしておく RewriteEngine On #必ずOnにしておく RewriteLog "logs/rewrite_log" #デバッグに非常に便利 (/var/log/httpd/rewrite_log) RewriteLogLevel 9 #9が最高。ログが多すぎるときは1に。デバッグが終わったらコメントアウトしておく
- 条件文
GETリクエストで、/foo または /bar へのアクセスで、クエリーの中にABCが入っていたら。(NCは大文字・小文字区別しない。ORはOR条件)
RewriteCond %{REQUEST_METHOD} GET RewriteCond %{REQUEST_URI} ^/foo$ [OR] RewriteCond %{REQUEST_URI} ^/bar$ RewriteCond %{QUERY_STRING} ABC [NC] RewriteRule . http://www.example.com/ [R,L]
- 否定
「!」を先頭に付けることで、「〜で無いなら」 という 否定 になる。
RewriteCond %{REQUEST_URI} !^/abc$
- パターンマッチングと後方参照
RewriteCond の「()」内でマッチした文字列を参照するには、「%番号」(例「%1」) を使う。
RewriteRule の「()」内でマッチした文字列を参照するには、「$番号」(例「$1」) を使う。
RewriteCond %{QUERY_STRING} DOMAIN=([^=&]+) RewriteRule . http://%1/ [QSA,P,L] RewriteRule ^/(.*)/$ http://example.com/$1 [QSA,P,L]
- 環境変数の設定
環境変数の設定は、RewriteRule で行う。%{変数名}で参照する。
RewriteRule ^/(.*)/$ - [E=MYHOST,C] RewriteRule ^/(.*)/$ http://%{MYHOST}/ [R,L]
- プログラムを使った条件や書き換え
RewriteMap my_script prg:/etc/httpd/bin/my_script.pl RewriteCond ${my_script:%{REQUEST_URI}} ABC [OR] RewriteCond ${my_script:%{REQUEST_URI}} xyz [OR] RewriteCond ${my_script:%{REQUEST_URI}} 123
my_script.pl
#!/usr/bin/perl $| = 1; while (<>) { chomp; my $mod = time % 3; if($mod == 0) { print "ABC\n"; } elsif($mod == 1) { print "xyz\n"; } else { print "123\n"; } }