htaccess:强制所有页面上的http和所选目录上的https

时间:2011-08-14 20:09:31

标签: http .htaccess mod-rewrite https

我有以下内容:

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} protected [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !protected [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

如果目录名为“protected”,请确保用户使用https。如果目录是除“protected”之外的任何内容,请确保用户使用http。

这很好用,但如何指定其他目录?

此外,有没有一种方法可以实现这一点,而无需两次指定目录?一次包括它和一次排除它?

谢谢!

更新

虽然由于我的规则,我的“受保护”文件夹被强制使用https,但任何不在“受保护”文件夹中的图像,样式表和javascripts的引用仍然被重定向到http。这导致“受保护”页面仅部分安全。在重定向代码之前添加以下内容可解决此问题:

RewriteRule \.(css|gif|jpe?g|js|png|swf)$ - [L]

2 个答案:

答案 0 :(得分:7)

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} protected [NC,OR]
RewriteCond %{REQUEST_URI} protected2 [NC,OR]
RewriteCond %{REQUEST_URI} protected3 [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !protected [NC]
RewriteCond %{REQUEST_URI} !protected2 [NC]
RewriteCond %{REQUEST_URI} !protected3 [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

您可以使用OR添加更多选项!


以下是有关mod_rewrite条件的详细信息: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteCond

答案 1 :(得分:0)

我在vhost配置中执行此操作(LocationMatch在htaccess中不可用,但这样可确保您不会意外删除它):
(注意:将__SERVER__替换为您的服务器,它不是自动的。)

<VirtualHost *:80>
    ...
    <LocationMatch "(.*(p|P)hpMyAdmin.*)">
        RedirectPermanent / https://__SERVER__/
    </LocationMatch>
</VirtualHost>
<VirtualHost *:443>
    ...
    <LocationMatch "!(.*(p|P)hpMyAdmin.*)">
        RedirectPermanent / http://__SERVER__/
    </LocationMatch>
</VirtualHost>

我从未测试过第二种情况(重定向到非安全)但它应该有效(不确定!展示位置)。
我还没有找到一个不指定它们两次的好方法,但很容易复制LocationMatch

的单行正则表达式