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"; }
}