mod_rewriteのRewriteCondで「特定の文字列を含まない」条件を定義してみました。
RewriteCondでは条件を正規表現で記述でき、正規表現の否定先読みや否定戻り読み機能を使うと「特定の文字列を含まない」条件を定義することができます。
今回はmod_rewriteでクエリーストリングに”action=login”が含まれる場合はHTTPS通信を、そうでない場合はHTTP通信を強制するように設定しました。
/action=(?!login)/という正規表現で”action=login”以外の”action=”にマッチする条件を定義できます。
このmod_rewrite設定は下記のようになりました。
RewriteEngine on RewriteCond %{HTTPS} off RewriteCond %{QUERY_STRING} action=login RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] RewriteCond %{HTTPS} on RewriteCond %{QUERY_STRING} action=(?!login) RewriteRule ^.*$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
これで下記のような動作を設定できました。
- HTTP通信時にクエリーストリングがaction=loginの場合はHTTPSにリダイレクトする
- HTTPS通信時にクエリーストリングがlogin以外のactionの場合はHTTPにリダイレクトする