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 などで、どちらかに統一してから比較するように修正すると、日本語でも通るようになりました。

ではでは