
http://example.jp/ は http だが、http://example.jp/security/ は SSL/TLS 必須と
する場合の .htaccess 設定。
方法1. バーチャルホスト (VirtualHost ディレクティブ) を別に切る
これが一番スマートかも。それができない場合は方法2 や方法3 で対応。
方法2. SSLRequireSSL を使う。
.htaccess に
SSLRequireSSL
と書くだけで、そのディレクトリ以下は SSL 必須となる (SSL 以外のアクセスは deny する)。
httpd.conf に記述するなら
<Directory "/foo/bar">
SSLRequireSSL
</Directory>
とする。
マニュアル: http://httpd.apache.org/docs/2.0/ja/mod/mod_ssl.html#SSLRequireSSL
方法3. RewiteCond で判別し、http(80) の場合は他に飛ばす。
RewriteEngine on
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ([^/]*)$ http://%{HTTP_HOST}/$0
マニュアル: http://httpd.apache.org/docs/2.0/ja/mod/mod_rewrite.html
ちなみに
SetenvIf SERVER_PORT 80 NO_SSL=1
Deny from env=NO_SSL
という判定方法は SetenvIf から SERVER_PORT を参照できないため無理っぽい。
さらに余談。Apache-SSL には SSLRequireSSL と逆の働きをする (SSL なら拒否)、
SSLDenySSL というディレクティブが存在する。しかし mod_ssl には SSLDenySSL は
存在しないし、mod_ssl を取り込んだ形の Apache2 にも存在しない (Apache-SSL と
mod_ssl は別物)。
する場合の .htaccess 設定。
方法1. バーチャルホスト (VirtualHost ディレクティブ) を別に切る
これが一番スマートかも。それができない場合は方法2 や方法3 で対応。
方法2. SSLRequireSSL を使う。
.htaccess に
SSLRequireSSL
と書くだけで、そのディレクトリ以下は SSL 必須となる (SSL 以外のアクセスは deny する)。
httpd.conf に記述するなら
<Directory "/foo/bar">
SSLRequireSSL
</Directory>
とする。
マニュアル: http://httpd.apache.org/docs/2.0/ja/mod/mod_ssl.html#SSLRequireSSL
方法3. RewiteCond で判別し、http(80) の場合は他に飛ばす。
RewriteEngine on
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ([^/]*)$ http://%{HTTP_HOST}/$0
マニュアル: http://httpd.apache.org/docs/2.0/ja/mod/mod_rewrite.html
ちなみに
SetenvIf SERVER_PORT 80 NO_SSL=1
Deny from env=NO_SSL
という判定方法は SetenvIf から SERVER_PORT を参照できないため無理っぽい。
さらに余談。Apache-SSL には SSLRequireSSL と逆の働きをする (SSL なら拒否)、
SSLDenySSL というディレクティブが存在する。しかし mod_ssl には SSLDenySSL は
存在しないし、mod_ssl を取り込んだ形の Apache2 にも存在しない (Apache-SSL と
mod_ssl は別物)。
スポンサーサイト


