ページ更新: 2010-03-21 (日) (4818日前)

サーバ管理やPukiwiki修正の記録。

[編集]

2010-03-20 #

[編集]

Apache 1.3.x, mod_rewrite, RewriteRule で % をurlencodeさせないようにする #

PukiWikiのページ名「ソフト/Bug Tracking/trac/未整理2006」を「ソフト/Bug Tracking/trac/2006」に変更したので、 旧URLへのアクセスを新URLにリダイレクトするルールを追加。同様に「未整理2007」「未整理2008」も。

こういうのを (「ソフト/Bug Tracking/trac/未整理2006」):

http://discypus.jp/wiki/?%A5%BD%A5%D5%A5%C8%2FBug%20Tracking%2Ftrac%2F%CC%A4%C0%B0%CD%FD2006

こちらにリダイレクトしたい (「ソフト/Bug Tracking/trac/2006」):

http://discypus.jp/wiki/?%A5%BD%A5%D5%A5%C8%2FBug%20Tracking%2Ftrac%2F2006

で、RewriteRule で % が %25 に置き換えられてしまうので、それを防ぐために、こんなのをRewriteMapで使った: /usr/local/bin/escape.pl

#!/usr/bin/perl
select STDOUT; $| = 1;
while (<>) {
    $_ =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
    print;
}
$| = 0;

参考にしたのはこちらの情報:

httpd.conf の変更点はこんなの:

$ sudo hg diff -U0 /etc/apache/httpd.conf
diff -r de102f467da2 apache/httpd.conf
--- a/apache/httpd.conf Sun Mar 21 02:00:50 2010 +0900
+++ b/apache/httpd.conf Sun Mar 21 20:27:58 2010 +0900
@@ -1181,1 +1177,2 @@
-    <IfModule mod_rewrite.c>
+        RewriteMap escape prg:/usr/local/bin/escape.pl
+
@@ -1183,1 +1180,1 @@
-       RewriteRule ^/wiki/$ "/wiki/?%A5%BD%A5%D5%A5%C8%2FBug%20Tracking" [R=301,L]
+       RewriteRule ^/wiki/$ "/wiki/?${escape:%A5%BD%A5%D5%A5%C8}/Bug Tracking" [R=301,L]
@@ -1186,1 +1183,1 @@
-       RewriteRule ^/wiki/$ "/wiki/?%A5%BD%A5%D5%A5%C8%2FBug%20Tracking%2Ftrac" [R=301,L]
+       RewriteRule ^/wiki/$ "/wiki/?${escape:%A5%BD%A5%D5%A5%C8}/Bug Tracking/trac" [R=301,L]
@@ -1189,1 +1186,1 @@
-       RewriteRule ^/wiki/$ "/wiki/?%A5%BD%A5%D5%A5%C8%2FBug%20Tracking%2Ftrac" [R=301,L]
+       RewriteRule ^/wiki/$ "/wiki/?${escape:%A5%BD%A5%D5%A5%C8}/Bug Tracking/trac" [R=301,L]
@@ -1191,0 +1188,8 @@
+       RewriteCond %{QUERY_STRING} ^%A5%BD%A5%D5%A5%C8%2FBug%20Tracking%2Ftrac%2F%CC%A4%C0%B0%CD%FD2006$
+       RewriteRule ^/wiki/$ "/wiki/?${escape:%A5%BD%A5%D5%A5%C8}/Bug Tracking/trac/2006" [R=301,L]
+
+       RewriteCond %{QUERY_STRING} ^%A5%BD%A5%D5%A5%C8%2FBug%20Tracking%2Ftrac%2F%CC%A4%C0%B0%CD%FD2007$
+       RewriteRule ^/wiki/$ "/wiki/?${escape:%A5%BD%A5%D5%A5%C8}/Bug Tracking/trac/2007" [R=301,L]
+
+       RewriteCond %{QUERY_STRING} ^%A5%BD%A5%D5%A5%C8%2FBug%20Tracking%2Ftrac%2F%CC%A4%C0%B0%CD%FD2008$
+       RewriteRule ^/wiki/$ "/wiki/?${escape:%A5%BD%A5%D5%A5%C8}/Bug Tracking/trac/2008" [R=301,L]

もしかしたら、httpd.conf で%を使わずに、EUC-JPで書き込んでも動くかも知れないけど。