【问题标题】:Redirect HTTP to HTTPS for one page将一页的 HTTP 重定向到 HTTPS
【发布时间】:2011-10-31 07:22:43
【问题描述】:

我知道这个问题已经被问死了,但是出于某种原因,在我阅读的 20 篇帖子中,没有任何内容适合我,希望有人能提供一些见解。

基本上,我有一个简单的购物车,我想将 2 个 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。

我一直在摸索循环等。

如果有人可以帮助仅在这 2 个页面上重定向到 HTTPS,然后在所有其他页面上重定向到 http,那将是一个很大的帮助,非常感谢。

【问题讨论】:

  • 修正了你的标题,因为我怀疑你不需要将 HTTP 重定向到 HTTP。
  • 您的方法听起来不安全,原因如下:如果您让用户在使用 HTTP 连接时登录,那么您将他的登录凭据暴露给任何窃听者。我不知道你想通过避免使用 HTTPS 来获得什么,但请停止这样做。 SSL 并不像您想象的那样占用大量资源。而且它也绝对不是页面加载速度优化的好地方。

标签: .htaccess ssl https


【解决方案1】:

这不是直接回答你的问题,但我觉得我把它作为一个答案(而且它太大了,不能作为评论发表)。

我的建议:请停止使用 htaccess 来完成此类任务(强制少数 URL 使用 HTTPS,强制其余 URL 使用 HTTP)。

最好的方法是为所有链接(页面,而不是资源)生成完整的 URL其中 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]

【讨论】:

  • 嗯,由于某种原因,我仍然遇到问题。有问题的网站是 palatinehillsestatewinery.com,问题出在结帐上。如果您添加一些产品并尝试结帐,您会看到 https 问题。基本上,我没有看到任何带有此代码的 https 重定向,而是它似乎违反了我的“删除 index.php”规则,导致 url 看起来像这样,没有 https:palatinehillsestatewinery.com/index.php/checkout ?
  • 我已经修改了条件:尝试RewriteCond %{REQUEST_URI} !^/(checkout|index.php/checkout) 而不是RewriteCond %{REQUEST_URI} !^/checkout(是的——我们还必须考虑已经重写的规则——我没有足够注意/checkout/不是真实的文件夹/文件)。或者尝试第二个变体(抱歉 - 代码未经测试,因为我现在无法连接到我的 Apache 机器,但应该可以正常工作)。
  • 这是一个旧答案,但值得提出的一点是,如果您调用外部库,这在使用社交媒体按钮乱扔网站时很常见,有时这些不能通过 HTTPS,所以您获取有关加载不安全内容的各种类型的浏览器错误。通过 HTTPS 加载整个站点会使更具社交性的 Web 应用程序变得相当困难。在我的例子中,我的订单页面没有社交集成,但网站的其余部分有,所以除了订单页面之外的所有页面都需要在 HTTP 中才能使用“The Social Web”™
  • @WesleyDavid 你在这里有绝对有效的观点。我主要与电子商务网站合作。结帐 + 客户帐户是社交/无共享的——这些页面具有仅针对该客户的独特内容(并且通常仅在这个时间点有效)——共享在这里毫无用处。另外——您不希望任何脚本能够(甚至可能)读取您的安全内容。
  • @LazyOne 我遇到这篇文章的原因是因为我想在这个问题中做一个与 OP 类似的规则,但是遇到了一些麻烦。有兴趣者:webmasters.stackexchange.com/q/49316/568
猜你喜欢
  • 1970-01-01
  • 2013-04-15
  • 2019-06-24
  • 2013-04-09
  • 1970-01-01
  • 2016-09-16
  • 2013-10-18
  • 1970-01-01
  • 2017-11-13
相关资源
最近更新 更多