a:2740 t:3 y:1

QHM(pukiwiki) URL正規化(統一) メモ

どハマりしました。
丸2日ぐらいかけて、正規表現も覚えながら解読して、なんとか動くようにしてみました。ネットに良く掲載されている正規化方法では、QHM(HAIK)やPukiwikiシステムだと色々ハマるようです。

pukiwikiシステムの場合、index.phpの後に色々と引数(クエリ ?以降の部分)を発行するので、色々な条件を勘案して正規化していないと、思ってもいないところで、誤動作を起こします。
一番困ったのは編集確定時。「POST /index.php HTTP~」というリクエストを投げているので、そこで引っかかります。

私が完全に正規表現がいまいち理解できていないのと、RewriteRuleの仕様がいまいちよく分からないので、間違っている部分もあるかもしれませんが、一応これで動いて編集も可能です。(デバッグモードなしで、原因を調べて正しく動かすとか、ほんともう死ねます)

.htaccessを編集します。

旧URLから新URLへの転送

#URLの転送
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^旧ドメイン$   ←「.」は「\.」にしてね
RewriteRule ^(.*) http://新ドメイン/$1 [R=301,L]

「index.php?FrontPage」 のFrontPageを削除

#「index.php?FrontPage」 を転送(FrontPage編集時におかしくなるのに対応しています)
RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} ^FrontPage$
RewriteRule ^(.*)index\.php /$1? [R=301,L]


トップページのURLが複数あるのが問題なので、Frontpageのクエリを削除します。
「index.php?FrontPage」⇒「index.php」にします。

「index.php」の削除

#index.phpの削除(日本語パラメーター時に動作がおかしくなる&編集できない、に対応)
RewriteEngine on
RewriteBase /
RewriteCond %{THE_REQUEST} !^POST
RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{QUERY_STRING} =""
RewriteRule ^(.*)index\.php /$1 [NE,R=301,L]


「index.php」を削除してすっきりしたULRにします。

ネットに掲載されているようなコードでindex.phpを単純に書き換えすると、かなり挙動が怪しくなります。

ネット掲載の一般的なコードでは、「index.php?ページ名(日本語)」だったときに誤動作するので、トップページのクエリが無い場合のみ転送するようにします。

そして、編集時にもおかしくなるので、postするときは除きます。

POSTを除くよりGETだけを条件にした方がいいのかな?
よくわかりませんが、めんどくさいのでとりあえずこれで。
動作保証はしかねますが、今のところ問題はありません。

最後に

良くわかっていない部分もあるので、文法とか間違っている部分があると思います。
間違いがあればご指摘お願いします。