さくらのレンタルサーバでのhttps強制とベーシック認証

普段はheorkuを触っている事が多いのだが、今回はさくらのレンタルサーバを使用することになり、その環境でのhttps強制を設定しようとしたところ、リダイレクトループでハマったのでメモ。

通常のリダイレクト

どうやらさくらのサーバはかなりクセの強いことで有名らしく、以下のような普通の?https強制のコードだとリダイレクトループとなってしまう。

1
2
3
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ロードバランサのリダイレクト

ロードバランサを使っている場合はHTTPSonにならないため、ずっとoffの状態になりリダイレクトループが起こる。
よって、以下のように書く。

1
2
3
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)?$ https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]

さくらのリダイレクト

しかしさくらの場合は特殊なようで、以下ような挙動になっているよう。

  • %{SERVER_PORT}には常に80が設定されている
  • SSLアクセス時には、%{ENV:HTTPS}にはON%{HTTP:X-Sakura-Forwarded-For}にはリクエスト元のIPが設定される

よってhttpsでない判定の場合は、%{ENV:HTTPS}がonではない、%{HTTP:X-Sakura-Forwarded-For}は空、の場合はリダイレクト、という判定にすればよいよう。

よって以下となる。

1
2
3
4
RewriteEngine On
RewriteCond %{ENV:HTTPS} !^on$
RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ベーシック認証

ベーシックをかける際に、そのままベタで書いてしまうとhttpsへリダイレクトさせている関係上、httpでベーシック認証、httpsでベーシック認証、と2回聞かれることになってしまう。
これをhttpsでのアクセス時にのみ有効としたいので、上記のさくらサーバの特性を活かして、%{HTTP:X-Sakura-Forwarded-For}が空でない場合にのみ、ベーシックを有効とするようにした。
(%{ENV:HTTPS}は、ケースによってはonにならない場合もあるよう)

1
2
3
4
5
6
<If "%{HTTP:X-SAKURA-FORWARDED-FOR} != ''">
AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /your/password/path/.htpasswd
require valid-user
</If>

参考

   このエントリーをはてなブックマークに追加