【问题标题】:RewriteRule + HTTPS redirect for specific requests特定请求的 RewriteRule + HTTPS 重定向
【发布时间】:2016-01-03 13:30:35
【问题描述】:

我已经设置了htaccess 文件来处理具有特定规则的用户请求和具有其他规则的通用请求:

# users requests (i.e. users/login.html)
RewriteRule ^users/([^/]+)\.html$ mvc.php?rt=users/$1 [L,QSA,NC]

# generic requests (controller/action/id.html)
RewriteRule ^([^/]+)/([^/]+)/([^/]+)\.html$ mvc.php?rt=$1/$2&id=$3 [L,QSA,NC]

# generic requests (controller/action/)
RewriteRule ^([^/]+)/([^/]+)/$ mvc.php?rt=$1/$2 [L,QSA,NC]

# generic requests (controller/id.html)
RewriteRule ^([^/]+)/([^/]+)\.html$ mvc.php?rt=$1&id=$2 [L,QSA,NC]

# generic requests (controller.html)
RewriteRule ^([^/]+)\.html$ mvc.php?rt=$1 [L,QSA,NC]
RewriteRule ^$ mvc.php?rt=index [L,QSA,NC]

这工作正常,并且 URL 翻译得到正确处理。我现在的目标是强制所有用户请求通过 HTTPS 发送。我正在尝试按照RewriteHTTPToHTTPS 中的说明设置重定向规则。我知道这不是推荐的解决方案,但我的服务器似乎不支持VirtualHost 语句。这是我的代码:

# users http to https
RewriteCond %{HTTPS} !=on
RewriteRule ^users(.*) https://%{SERVER_NAME}/users$1 [R,L]

不幸的是,这似乎不起作用,因为我需要在所有规则之后插入L 标志,这会导致处理在满足规则时停止。因此,如果首先在 htaccess 中插入 http-to-https 规则,则满足此规则并忽略用户特定规则(其他情况反之亦然)。

有没有办法做到:

  1. 使用特定规则处理用户请求
  2. 强制通过 HTTPS 发送用户请求

有htaccess 规则?

【问题讨论】:

  • 为什么你只想将某些请求重定向到 https ?你知道它不安全并且不能防止 MITM+sslstrip 吗? (唯一的保护是对整个域使用 https 并激活 HSTS)
  • @Tom:实际上,我认为保护包含敏感数据的页面(例如用户页面)就足够了。此外,认为强制通过 HTTPS 发送通用页面(例如条款和条件页面)是没有用的。但我不知道你指出的问题。所以你的建议是通过 htaccess 强制所有请求通过 HTTPS?

标签: apache .htaccess mod-rewrite redirect https


【解决方案1】:

出于多种原因,我的建议是: - 对所有 http 请求执行 301 重定向到 https - 在所有 https 答案中使用 HSTS

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

或

<VirtualHost *:80>
       ServerAlias *
       RewriteEngine On
       RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301]
</VirtualHost>

在 443 虚拟主机中: 标头始终设置 Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

警告:仅当 https 适用于所有网页时才设置 Strict-Transport-Security。如果您不确定,可以在开始时尝试 3600(10 分钟)。 “includeSubDomains”将用于所有子域的 https,“preload”将允许将您的网站添加到浏览器的预加载列表中。

如果您有一个登录页面,请不要忘记 cookie 上的 Secure 属性(没有它,cookie 也将与不安全的 http 请求一起发送)。

为什么? - 因为没有 HSTS,有人可以强制浏览器向http://example.com/mysecurepage 发出请求,然后在您回答 301 之前拦截 http 请求,并响应与您响应的页面相同的页面,但使用 http 链接。这种攻击称为 sslstrip,唯一可以阻止它的是 HSTS(如果可能,preloaded) - 如果您忘记在 cookie 上添加安全属性,使用 HSTS 可以保护您(但并非所有浏览器都知道 HSTS,这就是使用安全属性仍然很重要的原因!) - 因为很容易错过哪些页面必须标记为安全: 如果页面要求提供个人数据(电子邮件、姓名、...),那么在大多数欧洲国家/地区,您有义务保护它;有时,一个页面不询问个人数据而是显示它;有时页面内容是公开的这一事实并不意味着访问者接受任何知道他访问它的人。 - 使用 HTTP2 和 SPDY 加密的页面可以比未加密的页面更快地提供:https://istlsfastyet.com/

【讨论】:

  • 非常清楚的解释,+1。不幸的是,我正在使用的服务器似乎不支持 VirtualHost 语句(当我在 htaccess 中添加它时,我收到 500 内部服务器错误)。另外,它也不支持 HSTS。即使没有这些要点,有没有办法提高连接安全性?提前致谢。
  • @Giorgio 我已经更新了没有 VirtualHost 的案例的答案。当您说您的服务器不支持 HSTS 时,您的意思是您不能设置标头?
  • 这只是一个扣除。我想它不支持 HSTS,因为我在我的提供程序配置/帮助页面中进行了一些搜索,但没有找到任何关于 HSTS 的内容。有什么方法可以检查我的服务器是否真的支持 HSTS?感谢并为轻微的 OT 感到抱歉。
  • @Giorgio 它不必专门支持 HSTS:如果您可以设置自定义标头,那么它支持 HSTS :)
  • 好的,我明白了。最后一点:因为我使用的是你的第一个 sn-p(没有 VirtualHost),所以我不能在 443 Virtualhost 代码块中包含 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" 语句。所以我在 https RewriteRule 之后添加了它。对吗?
猜你喜欢
  • 2014-12-28
  • 2018-11-10
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多