我有以下内容:
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]
答案 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