我知道这个问题已经被问死了,但出于某种原因,在我读过的20篇帖子中,没有一篇对我来说是正确的,希望有人能提供一些见解。
基本上,我有一个简单的购物车,我想要重定向两个uri的HTTPS,我的结账页面,和我的管理文件夹:
/checkout
/admin
我可以使用以下代码成功重定向到HTTPS版本以进行结帐:
RewriteEngine On
#https
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^checkout https://palatinehillsestatewinery.com/checkout [R=301,L]
# remove index.php, this is just included to show everything in my .htaccess
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
我发现这个和所有其他解决方案的问题是,一旦我决定返回一个不应该是HTTPS的页面,url仍然是HTTPS。
我一直在笨拙地处理循环等问题。
如果任何人可以帮助重定向到HTTPS在这两个页面,然后在所有其他页面上的http,这将是一个巨大的帮助和非常感谢。
发布于 2011-08-20 18:22:11
这不是直接回答你的问题,但我觉得我把它作为一个答案(加上它太大了,不能作为评论)。
我的建议:请停止玩htaccess来完成这类任务(强制少数URL使用HTTPS,强制其余URL使用HTTPS)。
最好的方法是为所有链接(页面,而不是资源)生成完整的URL ,其中包括域名和协议。在这种情况下,所有URL都将立即具有正确的协议(HTTP/HTTPS)。当然:如果(出于某种奇怪的原因)是通过HTTP请求的,那么您仍然可以将(301或302重定向)请求修复为假定为https的请求。这就是.htaccess可以安全和容易使用的地方。
如果用户将通过HTTPS请求普通页面(应该通过HTTP提供) --那么让他这样做--这没有什么问题。是的-- HTTPS在服务器端需要更多的资源,但是如果您以这种方式生成所有的链接,实际上将不会出现这种情况,除非用户特别地更改了协议。即使这样一个页面将通过HTTPS提供服务,他单击的下一个“正常”链接也将是HTTP -- 1个额外的基于HTTPS的页面查看不会杀死您的服务器。
当站点有安全区域时,我一直在使用这种方法。根据日志,我们只有不到0.01%的页面浏览量是通过“错误的”协议被查看/试图被查看的--其中绝大多数是机器人或尝试黑客攻击/漏洞搜索。
基于这样的统计数据,我会说--它工作得很完美。是的--您需要稍微修改一下代码/模板来实现这一点。但这比摆弄.htaccess和mod_rewrite要好得多。
无论如何,这里有一些规则可以帮你完成这项工作:
# force https for all URLs in /checkout
RewriteCond %{HTTPS} =off
RewriteRule ^checkout https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# don't do anything for images/css/js
RewriteRule \.(gif|jpe?g|png|css|js)$ - [NC,L]
# force http for all other URLs that are not in /checkout
RewriteCond %{HTTPS} =on
RewriteCond %{REQUEST_URI} !^/(checkout|index.php/checkout)
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# your other rules here, e.g.:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
或
# force https for all URLs in /checkout
RewriteCond %{HTTPS} =off
RewriteRule ^checkout https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]
# force http for all other URLs that are not in /checkout
RewriteCond %{HTTPS} =on
RewriteCond %{REQUEST_URI} !^/checkout
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# your other rules here, e.g.:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
https://stackoverflow.com/questions/7133599
复制相似问题