日本語パラメータ付き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を作る。
が、301リダイレクトのための指定。
でパラメータを取得し、パラメータがない場合は単純に新URLへ転送。パラメータがある場合は、文字列に含まれる「%25」を「%」に置換したパラメータを付けてから転送している。
例えば、パラメータに「日本語」が含まれる場合、まず「%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」を「%」に置換したパラメータを付けてから転送している。