新ブログに移行する作業をしていて、サイトグローバルの404ページではなく、ブログの404ページに飛ばすように/blog以下の.htaccessを書き換え。
そして、テストしてみると無事カスタムエラーが表示された…んだけど、ふと気になってChromeのデベロッパーツールで見てみると、何故か301リダイレクトが走って、エラーページ自体は200で表示されてる。
いわゆるソフト404。これはまずい。
でも、よくありがちな
ErrorDocument 404 https://foo.example.com/404.html
のように絶対URLを指定していなかったので、不思議に思い、mod_rewriteベース(REQUEST_FILE判定)や、CGIエラーページも試してみたけど、前者はそもそも全く反応せず、後者はエラーCGI自体こそ404を返すものの、一旦301でリダイレクトされてる。
ひたすら試行錯誤して、もう時間切れ…!というところで、もしやHTTPSリダイレクト関連かも!?と思って弄ってみたところ、BINGO!
強制HTTPS化のために、.htaccessに
RewriteCond %{ENV:HTTPS} !^on$
RewriteRule ^(.*) https://mcrn.jp/$1 [R=301,L]
のように書いてて、これはこれでうまく動いてた。
(普通の%{HTTPS}や%{SERVER_PORT}での判定は不可。参考:さくらのSNI SSLでhttp→httpsリダイレクト - ヲレサイト)
ところが、どういうわけかErrorDocumentの処理が行われるときは、既にHTTPSであるにも関わらず%{ENV:HTTPS}がセットされていないらしく、リダイレクトされてしまう。
(さくらのHTTPSがプロキシ方式だから?)
仕方が無いので、独自変数を使う方法に変更。
RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
RewriteRule ^(.*) https://mcrn.jp/$1 [R=301,L]
これだと、ErrorDocumentの処理が行われても問題なく動作する。
(元のURLのまま、エラーコード404でエラーページが返る)
うー、ちょっとブログテンプレート弄ってただけのつもりがとんでもない藪蛇。
でも、早めに気付いておいてよかった。まさかソフト404(というか、エラーページへの301リダイレクト)返してるとは思いもしなかったよ。
コメント