日本語パラメータ付きURL(PukiWikiなど)の301リダイレクト

カテゴリ:サイト運営&開発
日時:2010/02/28 20:06

PukiWikiなど、日本語のパラメータがURLに含まれるページのリダイレクトには注意が必要だ。日本語のパラメータはURLエンコードされるが、リダイレクトのタイミングで1回余計にエンコードが行われてしまうため、正常にデコードできない。

例えば、パラメータに「日本語」が含まれる場合、まず「%93%fa%96%7b%8c%ea」にエンコードされる。301リダイレクトを行うと、この文字列に含まれる「%」が「%25」にエンコードされ、「%2593%25fa%2596%257b%258c%25ea」になってしまう。リダイレクト後にこれがデコードされるが「%93%fa%96%7b%8c%ea」となってしまい、「日本語」には戻らないのだ。

京極夏彦作品人名事典では、.htaccess+mod_Rewriteではなく、PHPを使う方法でこの問題を回避した(PHPが唯一解というわけではないが)。 まず、旧URLに以下の内容のindex.phpを作る。


<?php~
$strQueryString = $_SERVER["QUERY_STRING"];~


header("HTTP/1.1 301 Moved Permanently");~
if ($strQueryString == NULL) {~


    header( "Location: http://kyogoku.reichsarchiv.jp/"); ~
} else {~
    $strQueryString = ereg_replace('%25', '%', $strQueryString);~
    header( "Location: http://kyogoku.reichsarchiv.jp/?" . $strQueryString); ~
}~
?>



header("HTTP/1.1 301 Moved Permanently");


が、301リダイレクトのための指定。


$_SERVER["QUERY_STRING"]


でパラメータを取得し、パラメータがない場合は単純に新URLへ転送。パラメータがある場合は、文字列に含まれる「%25」を「%」に置換したパラメータを付けてから転送している。