【发布时间】:2011-07-11 20:24:40
【问题描述】:
我想强制一部分网页使用 https,并将所有其他网页强制使用 http。 在 htaccess 中,我使用了我在另一篇文章中找到的以下脚本,但这不起作用...
RewriteCond %{HTTPS} off
RewriteRule ^(login|signup)\.php https://%{HTTP_HOST}%{REQUEST_URI} [R,L,QSA]
RewriteCond %{HTTPS} on
RewriteCond ${REQUEST_URI} !(login|signup)\.php
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L,QSA]
HTTP 应该是强制的,HTTPS 应该是强制的,但是例如https://mywebsite.com/signup 在我的浏览器中会产生一个无限循环错误。任何想法出了什么问题?
我将代码更改为以下似乎可行,但由于网页上的安全和不安全项目,现在 SSL 仅部分实现。我检查了网址,例如图像、样式表和外部 javascript 文件位这些都是相对的,不应该造成问题...如果有人知道如何处理这个问题,我会很高兴听到它。
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/login$ [OR]
RewriteCond %{REQUEST_URI} ^/signup$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !login$
RewriteCond %{REQUEST_URI} !signup$
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
【问题讨论】:
-
无需对非登录/注册页面强制使用 HTTP(顺便说一句,帐户页面(如果有的话)——它们将通过 HTTP 提供服务吗?)。而是首先在您的代码中生成正确的 URL(即,而不是
<a href="/aboutus">执行<a href="http://www.example.com/aboutus">),因此客户将始终在没有 mod_rewrite 帮助的情况下访问 HTTP。如果客户想通过 HTTPS 访问主页或任何其他页面......然后让他 - 这没有任何问题。只要您的所有链接都具有正确的 URL,除非客户故意更改 URL,否则这种情况永远不会发生。 -
通过不强制 HTTP,您将不会遇到安全页面上的不安全内容 (CSS/JS/Images) 的问题。这就是我一直在为我的网站编写代码的方式。是的 - 更改所有链接以在现有页面中包含域名和协议是一项相当多的工作......但是对于新页面/新项目,它没有区别(没有额外的开销)。是的——你应该能够通过 mod_rewrite 修复它(添加一个或 2 个以上条件)..但这不是正确的方法(至少在我看来)。
-
感谢您的帮助。我现在使用 mod_rewrite 在那些需要保护连接的页面上强制使用 https。我删除了强制 http 的部分,因为这也强制安全页面上的引用,例如js/css/image 文件被重定向到 http(这些文件没有在 RewriteCond 中验证),并给出了在同一页面上有安全和非安全项目的问题。正如您所建议的那样,将所有内容正确地引用到 http 或 https(如果用户更改 url,则强制使用 https)以及完整的 URL,现在一切正常。谢谢!
标签: .htaccess mod-rewrite https