.htaccess 强制特定URL使用HTTPS

.htaccess 强制特定URL使用HTTPS,.htaccess,redirect,ssl,https,.htaccess,Redirect,Ssl,Https,这应该是一个快速的。。。这是我当前的.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] </If

这应该是一个快速的。。。这是我当前的.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
#开始WordPress
重新启动发动机
重写基/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则/index.php[L]
#结束WordPress
我需要做的是确保如果
http://www.mydomain.com/cart/
已到达,需要强制HTTPS。。。因此
/cart/
/cart/
中的任何内容都可以尝试在其他规则之前添加此规则(但在重写基础之后):


一旦请求发送到
http://www.mydomain.com/cart/
,如果请求中有任何敏感数据,则为时已晚。强迫它打破!至少,它会告诉你你的链接有问题。更多详情请参见前面的答案:

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

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

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

  • http://yoursite/
    https://yoursite/
    实际上是两个不同的站点。没有理由期望所有对象的映射为1:1 从一个URI空间到另一个URI空间的资源(就在同一个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访问),那么风险不一定很大

自动重定向变得更加危险的地方是当它们隐藏更大的问题时

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


使仅应通过HTTPS的纯HTTP部分不做任何有用的事情实际上可以帮助您更清楚地看到错误所在。由于如果链接得到正确实现,用户无论如何都不应该出现在那里,这对他们来说不是什么问题。

请求中没有任何敏感数据。。。我发送的唯一内容是在URL中,它只是一个参数,指示他们购买的产品。@dcolombus,请求中是否有敏感数据并不重要。关键是,不应该有任何对该URL的请求不是通过HTTPS的(如果您总是希望它通过HTTPS),因此任何首先发送普通请求的操作都将是错误的。强制它中断可以帮助您检测错误并防止错误的假设(也许有一天您也会开始错误地将敏感数据放入请求中)。我要做的就是确保当用户被定向到
/cart/
时,我们强制打开SSL。正因为如此,如果没有SSL,他们不可能完成整个过程。@dclombus正是我的观点:在主站点的
/cart/
上返回404,或者将它们重定向到主页(可能更好)。这将迫使您确保重定向到
/cart/
的所有内容都使用
https://
地址,这是正确的方法。重写只会隐藏开发过程中的潜在错误。不要将这些错误留在dev或prod中。@dcolombus,不确定,但我猜是直接
重写规则^cart/(*)$http://www.mydomain.com/
(重定向到站点的根目录)应该足以中断该过程,同时让用户使用它比404更好
RewriteCond %{HTTPS} off
RewriteRule ^cart/(.*)$ https://www.mydomain.com/cart/$1 [R,L]