【问题标题】:Is this safe to assume non-https?假设非 https 是否安全?
【发布时间】:2016-12-13 08:00:27
【问题描述】:

在我的 .htaccess 文件中,我创建了以下规则以确保它始终是 HTTPS:

# Redirect To HTTPS...
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

假设 443 以外的每个端口都应该重定向到 HTTPS 是否安全?在特定情况下是否也应允许其他端口?我希望我的网站永远不会以未加密的方式提供。

【问题讨论】:

    标签: .htaccess https http-redirect


    【解决方案1】:

    将以下规则添加到您的 .htaccess 中,它将强制 https 独立于端口并将所有 http 流量重定向到 https。

    Options +FollowSymLinks -MultiViews
    # Turn mod_rewrite on
    RewriteEngine On
    
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    

    【讨论】:

    • 如果您解释了原因,那将是一个更好的例子 - 基于端口选择的过滤是无用的,而是根据使用的协议进行过滤。但仍然是一个很好的解决方案。
    • 关闭 HTTPS 是好事!但是使用 HTTP_HOST 是个坏主意,这个值使用客户端发送的 host 标头 - 不要使用它!
    • 还有一件事 - 最好使用 =off 而不是 off。这是人们经常忘记的——没有=,它是一个正则表达式!它会带来很小的性能下降,但这并不重要。更糟糕的是,它还会匹配offsideripoff 等。如果我们要在有更多选项而不仅仅是开和关的情况下使用这些值,请记住这一点。
    • %{HTTP_HOST}host 标头中发送,但仅当此标头有效并被您的 VirtualHost 条目识别时,才会执行规则。也可以使用%{SERVER_NAME}
    【解决方案2】:

    根据 RFC 文档 http://www.rfc-editor.org/rfc/rfc2616.txt,端口 80 和 443 是 HTTP/HTTPS 的默认端口。因此浏览器会自动使用这些端口来连接这些协议。如果不是 80/443,则需要向浏览器提供端口号。

    因此,除非您有理由从非标准端口提供服务,否则您可以从端口 80 重定向到 443。您需要注意使用 catch all 重定向到 443,以防您开始使用另一个端口进行 HTTP 连接或同样使用端口 80 重定向然后添加更多端口用于服务不会重定向。

    有很多方法可以根据您的要求编写重定向。

    80 端口重定向示例:

    RewriteEngine On
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
    

    【讨论】:

    • 再次。 RewriteCond %{SERVER_PORT} 80 不是端口 80。它是端口号中包含“80”的端口。这是你的意思吗?我猜不是。
    • 另外,如果你不需要它,为什么要从 uri 中捕获正则表达式?请改用 {REQUEST_URI}。
    • 最后一件事 - 您可能想要永久重定向,而不是临时重定向。使用 R=301。
    【解决方案3】:

    除非明确要求,否则浏览器将仅连接到端口 80(如果指定了 https,则为 443)。您的网络服务器应该只监听端口 80 和 443,因此您只需重定向端口 80。

    如果您希望始终使用 https,则应添加 HSTS 并预加载您的网站:

    https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security

    https://hstspreload.appspot.com/

    HSTS 是一个标头,告诉浏览器只连接到 https,而不是 http,但它仅在第一次成功连接后才有效(因此第一次连接可能不安全)。如果您预加载它,那么浏览器甚至在第一次访问之前就知道您的网站只使用 https,因此它也可以保护它。

    【讨论】:

      【解决方案4】:

      如果您可以控制 Apache 配置并关心性能问题,则无需使用 .htaccessmod_rewrite。这将避免为每个 Web 请求加载和解析 .htaccess

      只需在您的虚拟主机配置中使用这个简单的Redirect 指令:

      <VirtualHost *:80>
          ServerName www.example.com
          Redirect "/" "https://www.example.com/"
      </VirtualHost>
      

      阅读更多:when not to use mod_rewrite

      【讨论】:

      • 是的,我也已经找到了。我可能会尝试在服务器配置中反映我的 .htaccess 规则。
      猜你喜欢
      • 2017-02-26
      • 1970-01-01
      • 2013-08-23
      • 2020-07-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 2011-06-02
      • 2015-11-15
      相关资源
      最近更新 更多