bbPress + RewriteRule + 日本語URLの対応方法
bbPressを使ってWordpress MUとかと組み合わせてサイトを構築した時に、bbPressのパーマリンクに日本語が入る際にリダイレクトの永久ループが発生するので悩んでいました。
.htaccessの内容
RewriteEngine On RewriteBase / RewriteRule ^forum/([^/]+)/page/([0-9]+)/?$ /forum.php?id=$1&page=$2 [L,QSA] RewriteRule ^forum/([^/]+)/?$ /forum.php?id=$1 [L,QSA] RewriteRule ^topic/([^/]+)/page/([0-9]+)/?$ /topic.php?id=$1&page=$2 [L,QSA] RewriteRule ^topic/([^/]+)/?$ /topic.php?id=$1 [L,QSA] RewriteRule ^tags/([^/]+)/page/([0-9]+)/?$ /tags.php?tag=$1&page=$2 [L,QSA] RewriteRule ^tags/([^/]+)/?$ /tags.php?tag=$1 [L,QSA] RewriteRule ^tags/?$ /tags.php [L,QSA] RewriteRule ^profile/([^/]+)/page/([0-9]+)/?$ /profile.php?id=$1&page=$2 [L,QSA] RewriteRule ^profile/([^/]+)/([^/]+)/?$ /profile.php?id=$1&tab=$2 [L,QSA] RewriteRule ^profile/([^/]+)/([^/]+)/page/([0-9]+)/?$ /profile.php?id=$1&tab=$2&page=$3 [L,QSA] RewriteRule ^profile/([^/]+)/?$ /profile.php?id=$1 [L,QSA] RewriteRule ^profile/?$ /profile.php [L,QSA] RewriteRule ^view/([^/]+)/page/([0-9]+)/?$ /view.php?view=$1&page=$2 [L,QSA] RewriteRule ^view/([^/]+)/?$ /view.php?view=$1 [L,QSA] RewriteRule ^rss/?$ /rss.php [L,QSA] RewriteRule ^rss/topics/?$ /rss.php?topics=1 [L,QSA] RewriteRule ^rss/forum/([^/]+)/?$ /rss.php?forum=$1 [L,QSA] RewriteRule ^rss/forum/([^/]+)/topics/?$ /rss.php?forum=$1&topics=1 [L,QSA] RewriteRule ^rss/topic/([^/]+)/?$ /rss.php?topic=$1 [L,QSA] RewriteRule ^rss/tags/([^/]+)/?$ /rss.php?tag=$1 [L,QSA] RewriteRule ^rss/profile/([^/]+)/?$ /rss.php?profile=$1 [L,QSA] RewriteRule ^rss/view/([^/]+)/?$ /rss.php?view=$1 [L,QSA]
この設定は bb-admin/rewrite-rules.php の内容を若干変更しただけのものです。
で、この状態でパーマリンクにタイトルを入れるように管理画面で設定して、日本語の掲示板とかトピックを作成して閲覧すると、リダイレクトの永久ループが発生します。 仕方が無いのでコードを追ってみたところ、
bb-includes/functions.php のbb_repermalink()関数にて、$uri と $check という文字列を比較している部分があるのですが、日本語のURIでアクセスした場合、urlencode()された日本語パスがこの2つの変数に格納されます。 イレギュラーなURIで無い限りこの2つの変数には同じ値が入っているはずなのですが、urlencode()された値が、片方の変数には大文字で、もう片方には小文字で格納されてしまっているのです。 なので、違う値として判断され、リダイレクトのロジックに突入していると。
この変数の値を strtolower などで、どちらかに統一してから比較するように修正すると、日本語でも通るようになりました。
ではでは