httpでアクセスしてきたユーザーをHTTPSの暗号化に転送したい。
こういうこと
http://example.jp/index.php?a → https://example.jp/index.php?a #リダイレクト
.htaccess
RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
.htaccessとmod_rewrite を組み合わせると簡単にできる。
仕組みの解説
#mod_rewriteを有効にする RewriteEngine On #書換条件: リクエストされたポートが443でない場合 RewriteCond %{SERVER_PORT} !^443$ # https付の同一サーバーの、同一パスに転送する RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
備考
HTTPSを強制は、移行のためにやっています。
あるディレクトをHTTPSに変更しました。以前の通りHTTPのブックマークを使ったユーザーを、新しいHTTPSへ転送したかったのです。
HTTPSの強制や変更後は、HTTPアクセスに404を返すのがベターです。404でなく転送(301)をするのがセカンドベターです。
ポート80で待ち受けするのに、document root 全体を転送してる以下の例はどこか変なのです。ドキュメントルート全体にRewriteでHTTPSを強制するのはおかしいのです。
<VirtualHost *:80> # (省略) RewriteEngine On RewriteLog "logs/rewrite_log" RewriteLogLevel 0 RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^/(.*)?$ https://%{HTTP_HOST}/$1 [L,R] </VirtualHost>http://app.assiona.to/archives/2009/12/192.html
こういう場合は、ErrorDocumentを使って転送するのがイイでしょう。たぶん上記のサイトの人は80番のドキュメントルートと443のドキュメントルート全体の区別がついていないと思います。
できるだけ、Rewriteせず、VirtualhostやDocumentRootの443ポート設定した方が良いです。
2016-04-24 追記
<VirtualHost *:80> # (省略) RewriteEngine On # RewriteLog "logs/rewrite_log" # RewriteLogLevel 0 RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^/(.*)?$ https://%{HTTP_HOST}/$1 [L,R] </VirtualHost>
RewriteLog と RewriteLogLevel は virtualHost のディレクティブで動かなかった。