PowerCMS環境にて、特定ページのリダイレクト処理をルートディレクトリ下のhtaccessに記述したが、どうもリダイレクトが走ってくれない。同一ファイル内のベーシック認証や正規化は動く。
なおかつ全部のリダイレクトが効かない訳ではなく、ごく浅い階層では走ったり走らなかったりする。なにこれ。
RewriteEngine On
RewriteRule ^test/$ https://www.example.com/ [R=301,L]
☝リダイレクト成功
RewriteEngine On
RewriteRule ^testA/$ /testB/ [R=301,L]
☝リダイレクト失敗
RewriteEngine On
RewriteRule ^test/test-test/test.html$ /testC/test-test2/test.html [R=301,L]
☝リダイレクト失敗
検証内容
既存のhtaccessに追加で記述している(=挙動は過去確認済のはず)のでサーバーレベルでのチェック(htaccessが有効か、リダイレクトが有効か)は省略した。
ファイルレベルでのチェック(名前が「.htaccess」、前後にスペースが含まれていない、
文字コードがUTF-8、改行コードLF、内容に全角が含まれていない、最後に空行がある)は問題なし。
となると記法が問題かと思うが、
- エスケープはとくに不要
- リダイレクト先をフルパスで記述する必要なし=同ドメインならルートパスで問題ない
- 正規表現の範囲も問題なし
で記法の問題点もすぐに見つからない。
ここから先は先輩からアドバイスを貰いつつ、
- 成功しているリダイレクト処理の左辺・右辺を少しずつ変えて試す
- ファイル末尾でなく先頭に記述を移動する
- 他の処理をすべて消してみる
など試す。右辺を変えて試した際に、リダイレクト先のページが存在しなくともリダイレクト処理は走ることがわかる。そのため左辺の記述が間違っていることが分かるが、
記述の移動や他の処理を消去しても処理が成功するわけでもない。
解決
原因は最終的に、下層のディレクトリにあったhtaccessが設定を上書きしていたことだった。
PowerCMSはブログの新規作成時「ダイナミックパブリッシング」がデフォルトで有効になるようになっており、その関係上mtview.phpに関するhtaccessファイルも自動生成されるようだ。
中身を見るとmod_rewriteについての命令が書かれている。
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} ^[^.]+$|\.(html|mtml|HTML|MTML)$ [NC]
RewriteRule ^ /test/.mtview.php [L]
</IfModule>
自分の理解力に自信はないが怪しい記述がある。(ブログより下のファイルを.mtview.phpにリライトしている?)あるいは単純に、mod_rewriteを上下階層で重ねて使っていたことが不具合を招いたのかもしれない。
本案件にダイナミックパブリッシングは使用していないとのことで当該htaccessファイルは削除すると、リダイレクト処理が問題なく動くようになった。
参考:https://httpd.apache.org/docs/current/mod/mod_rewrite.html