【问题标题】:Force HTTPS for specific URL对特定 URL 强制使用 HTTPS
【发布时间】:2012-02-24 16:55:09
【问题描述】:

这应该很快...这是我当前的 .htaccess 文件:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

我需要做的是确保如果达到http://www.mydomain.com/cart/,它需要强制HTTPS ...所以/cart//cart/中的任何内容

【问题讨论】:

    标签: .htaccess redirect ssl https


    【解决方案1】:

    一旦请求发送到http://www.mydomain.com/cart/,如果请求中有任何敏感数据,那就太迟了。强行打破!至少,它会给你一个提示,表明你的链接有问题。以前的答案中的更多详细信息:

    [ ... ] 请求到达服务器时, 太晚了。如果有中间人,他已经完成了他的攻击(或部分 它)在您收到请求之前。

    到那时你能做的最好的就是在没有任何有用内容的情况下回复。在 在这种情况下,重定向(使用 301 或 302 和 Location 标头) 可能是合适的。但是,如果用户(或 即使您作为开发人员)也会忽略警告(在这种情况下, 浏览器将跟随重定向并几乎重试请求 透明地)。

    因此,我只是建议返回 404 状态:

    • http://yoursite/https://yoursite/ 实际上是两个不同的站点。没有理由期望所有的 1:1 映射 URI 空间中的资源从一个到另一个(只是在相同的 方式,因为你可以有一个完全不同的层次结构 ftp://yoursite/)。
    • 更重要的是,这是一个应该在上游处理的问题:使用http:// 将您的用户引导至此资源的链接 应该被认为是坏了。不要让它自动工作。 拥有不应该存在的资源的 404 状态很好。在 另外,有错误时返回错误信息是好的: 它会迫使您(或至少提醒您)作为开发人员,您 需要修复导致此问题的页面/表单/链接。

    编辑:(示例)

    假设您有http://example.com/,这是您网站的非安全部分,允许用户浏览项目。他们在那个阶段没有登录,所以可以通过普通的 HTTP 登录。

    现在是购物车/付款时间。你想要HTTPS。您将用户发送到https://example.com/cart/。如果将用户发送到购物车部分的链接之一是使用纯 HTTP(即http://example.com/cart/),则这是一个开发错误。它不应该在那里。当您认为您将被发送到https://example.com/cart/ 时,中断该过程允许开发人员看到它(一旦修复,用户应该永远不会遇到问题)。

    如果只是指向您网站的 HTTPS 部分(通常是通过某个链接的 HTTP GET),则风险不一定很大。

    自动重定向变得更加危险的地方在于它们隐藏了更大的问题。

    例如,您使用的是https://example.com/cart/creditcarddetails,并且您填写了一些实际上应该只保留在 SSL 上的信息。但是,开发人员犯了一个错误,在表单中使用了一个普通的http:// 链接。此外,开发人员(毕竟是用户/人类)在 Firefox 中点击了“不要再向我显示此消息”,当它显示“警告:您正在从安全页面转到非安全页面”时(顺便说一句,不幸的是,Firefox 在事后警告:在向用户显示该消息时,它已经发出了不安全的请求)。现在,带有敏感数据的 GET/POST 请求首先被发送到不正确的纯 http:// 链接,并且自动重写告诉浏览器通过 https:// 再次尝试请求。它看起来不错,因为就用户而言,这一切都发生在几分之一秒内。然而,事实并非如此:敏感数据是以明文形式发送的。

    使纯 HTTP 部分应该只通过 HTTPS 而不做任何有用的事情实际上可以帮助您更清楚地看到问题所在。因为如果链接被正确实现,用户无论如何都不应该在那里结束,这对他们来说不是一个真正的问题。

    【讨论】:

    • 请求中没有任何敏感数据......我发送的唯一内容是在 URL 中,它只是一个表明他们正在购买的产品的参数。
    • @dcolumbus,请求中是否有敏感数据并不重要。关键是不应该有任何不通过 HTTPS 的 URL 请求(如果你总是希望通过 HTTPS),所以任何首先发送普通请求的东西都是错误的。强制它中断有助于您检测错误并防止错误假设(也许有一天您也会开始错误地将敏感数据放入请求中)。
    • 我要做的就是确保当用户被定向到/cart/ 时,我们强制开启 SSL。就是这样,如果没有 SSL,他们就无法完成整个过程。
    • @dcolumbus 正是我的意思:在您的主站点上的/cart/ 上返回 404,或者将它们重定向到您的主页(可能更好)。这将迫使您确保重定向到/cart/ 的所有内容都使用https:// 地址,这是正确的做法。重写只会隐藏开发过程中的潜在错误。不要将这些错误留在开发或生产中。
    • @dcolumbus,不确定,但我猜直接RewriteRule ^cart/(.*)$ http://www.mydomain.com/(重定向到您网站的根目录)应该足以破坏该过程,同时使其优于 404s想要手动调整地址栏的用户。如果您真的想重定向到 HTTPS URL,请确保它始终指向无法进行任何有用处理的页面(即没有 $1)。
    【解决方案2】:

    尝试在其他规则之前添加此(但在 RewriteBase 之后):

    RewriteCond %{HTTPS} off
    RewriteRule ^cart/(.*)$ https://www.mydomain.com/cart/$1 [R,L]
    

    【讨论】:

    • 是否有东西将 https 重定向回 http?你的日志是怎么说的?
    • /home/108777/domains/mydomain.com/html/.htaccess:重定向到非 URL
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 2019-01-23
    • 2014-05-06
    • 2014-01-20
    • 2016-03-12
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多