mod_rewrite

特定のディレクトリにアクセスがあったら、httpsにRedirectするという使い方。

RewriteEngine on
RewriteCond "%{SERVER_PORT}" "^80$"
RewriteRule "^test/(.*)" "https: //%{HTTP_HOST}/test/$1" [R,L]

RewriteCondの行で 変数SERVER_PORTが80だったらと定義している。
ポート80番 つまりhttpでのアクセスだったら。
RewriteRule で testディレクトリへのアクセスを httpsに変える、と定義している。

今回の話はWordPressを使用しているサイトで書き換えを行ったのですが、
WordPressはもともと、動的ページを静的URLにする仕組みを
mod_rewriteを使って実現している。

この仕組みが元々あるおかげで 他のサーバではURL書き換えに成功していたのに、
URL書き換えが出来なくてハマっていた。

WordPressmod_rewriteルール

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

変数REQUEST_FILENAMEのファイルがある場合は、Trueを返す というのが -f オプションの機能。
-d オプションは 変数REQUEST_FILENAMEのディレクトリがある場合は Trueを返す という内容。
!はnotの意味なので、この条件は
変数REQUEST_FILENAMEのファイル・ディレクトリが無かったら。 という条件。
無かった場合のみ、RewriteRule .(ドット)なんでも /index.php にRedirectする。
Lオプションは これ以上 ルール評価しない。というオプション。
この処理をしたら次へ行かないようになってる。

最初は

RewriteRule "^test/(.*)" "https: //%{HTTP_HOST}/test/$1" [R]

と書いていたのですが、これだとhttpsにRedirectされませんでした。
おそらくこのルールを通った後に、WordPressのルールを評価してしまって、
上手くいっていなかったのだと思います。

それと

RewriteRule "^/test/(.*)" "https: //%{HTTP_HOST}/test/$1" [R]

これも駄目でした。

今回使っていたのは .htaccessにルールを書いていました。
これがドキュメントルートに置いてある場合、 testディレクトリの 前の/ は無しで動作するようです。
逆に httpd.conf や、vhost.confなどのApache設定ファイルに直接書く場合は、
/test/ としないと動作しない・・・・ハズ?