さくらのレンタルサーバ HTTPSリダイレクトとErrorDocumentの罠

新ブログに移行する作業をしていて、サイトグローバルの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リダイレクト)返してるとは思いもしなかったよ。