$yuzu->log();

技術ネタなど。

http→httpsリダイレクトで301と設定してるのに307となってしまう問題

httpサイトをhttpsサイトに変更する機会がありました。 Apacheの設定でhttpでアクセスがあったらhttpsに301ステータスでリダイレクトとしていました。 設定は下記の通りです。

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

しかしGoogle Dev Toolで確認してみると307ステータスでリダイレクトしているようでした。

f:id:yuzurus:20150202231004p:plain

どうやら原因はHSTSでした。

HSTSとは?

WebサーバーがWebブラウザに対して、セキュアなHTTPSのみでサービスを提供したい場合、ユーザーの利便性といった観点から、HTTPで接続した際にHTTPSURIにリダイレクトする場合がある。その際に、Webサーバーからのレスポンスにリダイレクトする指示を入れることになるが、HTTPは改竄検知機能を持たないため、攻撃者がこれを悪意のあるサイトにリダイレクトする指示に書き換えたとしても、Webブラウザはそれを知ることができず、中間者攻撃を許してしまう。 HSTSではユーザーがWebブラウザにスキームがhttpであるURIを入力するなどしてHTTPで接続しようとした時に、予めWebサーバーがHSTSを有効にするよう指示してきたドメインの場合、Webブラウザが強制的にHTTPSでの接続に置き換えてアクセスすることで、この問題を解決する。
HTTP Strict Transport Security - Wikipedia

ユーザの利便性のためにHSTSを設定していたのですが、このリダイレクトのせいで307となっていたのですね。

ただこの307はGoogleは301と認識するようです。

GoogleウェブマスターツールのFetch as Googleで実施したところちゃんと301ステータスになっていました。

f:id:yuzurus:20150202231832p:plain

一安心です。