無料Wikiサービス | デモページ
Linuxなどのメモ書き
検索

Adsense

mod_rewrite - RewriteMap の差分
Rev.1→最新版  追加箇所 削除箇所


作成中RewriteMap使うとテキスト形式マップファイル使ってURLえたりPerl外部プログラム使ってURLえることができる

RewriteMap以下ではPerlスクリプトURLえをなう使うとテキスト形式変換ファイル使ってURLえたりPerl外部プログラム使ってURLえることができる

PerlスクリプトURLえをなう
RewriteMapマップ(以下ではescape-map)外部プログラム(以下ではescape.pl)指定するprg:外部プログラムであることを意味する
escape.pl標準入力からった文字列escape(URLエンコード)して
escape-mapRewriteRuleから参照する

${escape-map:$2|$2}$2escape-map(つまりescape.pl)

外部プログラムを使用したURL書き換え

サンプルとしてURL書き換えの際、文字列をescape(URLエンコード)する書き換えを行なう。escape処理を外部プログラムに行なわせる。

RewriteMapでマップ名(以下ではescape-map)と外部プログラム(以下ではescape.pl)を指定する。prg:は外部プログラムであることを意味する。escape.plは標準入力から受け取った文字列をescape(URLエンコード)して返すPerlスクリプト。

escape-mapはRewriteRuleから参照する。${escape-map:$2}は$2をescape-map(つまりescape.pl)で処理して、変換結果を取得することを意味する。つまり${escape-map:$2}は$2がescapeされた文字列になる。

また、RewriteMapで外部プログラムを使用する場合は、RewriteLockでロックファイルを指定する必要がある。これは、複数のhttpdが同時に外部プログラムにアクセスしないように排他制御するのに使われる。

RewriteEngine on
RewriteLock
/tmp/RewriteMap escape-map prg:/usr/local/apache2/conf/escape.plmap.lock
RewriteRule ^/(.+)/pg/(.*)$ /$1/index.php?pg=${escape-map:$2|$2} [L]
RewriteMap escape-map prg:/usr/local/apache2/conf/escape.pl
RewriteRule ^/(.+)/pg/(.*)$ /$1/index.php?pg=${escape-map:$2} [L]

このルールは http://www.xxxx.com/april/pg/あああhttp://www.xxxx.com/april/index.php?pg=%e3%81%82%e3%81%82%e3%81%82 に書き換える。


URLをescapeするPerlスクリプト(escape.pl)
#!/usr/bin/perl

$| = 1;

while (<>) {
chop;
s/([^\w])/'%'.unpack('H2', $1)/eg;
print $_."\n";
}


外部プログラムの注意

  • 入出力にBuffered I/Oを使用しない(Perlなら$|を使う)
  • 変換結果を返す際、最後に改行を入れないとハングアップする。
  • スクリプトを修正した場合はApacheを再起動しないと反映されない。


URLをescapeするPerlスクリプト(escape.pl)
#!/usr/bin/perl

$| = 1;

while (<>) {
chop;
s/([^\w])/'%'.unpack('H2', $1)/eg;
print $_."\n";
}


RewriteLock[関連ページ]
最後改行mod_rewriteの使い方
$|
スクリプト修正した場合Apache再起動すること

[関連ページ]
mod_rewriteの使い方