.htaccessでのrewrite

httpd.confと同じように書いても動作しなかったので、メモ。


例として、フォームのページに遷移したらhttpsに変わる、
というようにしたいとする。


サーバーはUbuntu 9.10。


1 ヴァーチャルホストを作っておく。
/var/www/site1/
を作って、ここをドキュメントルートとしておく。


2 フォームページは1つディレクトリにまとめる。
/var/www/site1/form/
を作って、form関連のファイルはここにおく。
「form」ディレクトリ以下へのアクセスは、
httpsにする、という感じの設定にする。



3 httpd.confに書く場合
site1の設定ファイルで、

...

...

(ここからrewrite
RewriteEngine on
RewriteLog "/var/log/apache2/site1_rewrite.log"
RewriteLogLevel 9 (← 確認が終わったら、0にしておく)
RewriteCond %{SERVER_PORT} !^443$(ポートが443でないなら)
RewriteRule ^/form/(.*?)$ https://%{HTTP_HOST}/form/$1 [L,R]

という感じで期待通りの動作になる。
(ログ吐かないならlogの記述はなくてもいいみたいですが。)


.htaccessにこれと同じように書いても、期待通りに動作してくれない。


4 .htaccessに書く場合

RewriteEngine on
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^form/(.*)$ https://%{HTTP_HOST}/form/$1 [L,R]

confとの違いは、

  • RewriteBaseの指定
  • RewriteRuleの置換元の「form」の前の「/」をはずす


こちらを参照:
http://goo.gl/JtozE