【问题标题】:Correctly switching between HTTP and HTTPS using .htaccess使用 .htaccess 在 HTTP 和 HTTPS 之间正确切换
【发布时间】:2010-11-09 16:06:48
【问题描述】:

我们有一个购物网站,我们将其托管在共享主机(Mediatemple Gridserver)上。网站的某些部分需要使用 HTTPS(结帐等),但其余部分应使用 HTTP。

有谁知道我们如何始终强制对特定 URL 正确使用 HTTP/HTTPS?我们已经让它在各种状态下工作,但我们无法获得对应该在 HTTP 上但通过 HTTPS 请求正确切换回的页面的请求。

我环顾四周,但找不到合适的答案。

【问题讨论】:

  • 一定要和htaccess一起吗?该网站使用什么语言?
  • 你想用 https 阻止什么?

标签: http .htaccess ssl https


【解决方案1】:

对我来说是这样(我将它用于 wordpress 网站并重定向到 HTTPS)。您必须在 RewriteEngine 和 RewriteBase 行后面添加条件和规则行:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# I added these two lines for redirect to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L]
# (end of custom modifications)

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress`

查看条件RewriteCond %{HTTP:X-Forwarded-Proto} !https - 只有这对我的服务器托管有效。 (我也试过RewriteCond %{SERVER_PORT} !^443$RewriteCond %{HTTPS} off,但没有成功。

【讨论】:

    【解决方案2】:
    RewriteEngine on
    RewriteCond %{HTTPS} off [OR] 
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]
    

    我在负载均衡器后面遇到了一些问题。这就是我修复它的方法。

    【讨论】:

    • 这真的有效吗?它让我陷入了重定向循环。如果您有负载均衡器,则不会设置 HTTPS,并且会满足第一个 RewriteCond。如果不这样做,将会遇到第二个 RewriteCond。因此,每次您都会再次被重定向。我使用(另一个答案)[stackoverflow.com/a/26623196/2182900] 这基本上是一样的,但没有[OR] - 你只有在 HTTPS 都关闭并且 HTTP:X-Forwarded-Proto 不是 https 时才会重定向。
    【解决方案3】:

    这应该适用于几乎所有场景,并且应该适用于您的实际 vhost 或 .htaccess:

    RewriteEngine on
    RewriteCond %{SERVER_PORT} ^80$
    RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]
    

    (不要忘记 %{REQUEST_URI} 之前的斜线,因为这可能允许传递端口号,这很危险)

    【讨论】:

    • 您的回答虽然优雅,但有一个小错误。最后一行应该在 SERVER_NAME 之后有一个斜杠 (/),或者 www.test.com/dir 转发到 test.comdir
    • @Juhani 感谢您的评论。实际上, %1 映射到与根相关的 {REQUEST_URI} 环境变量。换句话说,如果你请求example.com/123,那么 REQUEST_URI === '/123';因此,另一个斜线将是多余的。它仍然可以工作,因为在大多数现代配置中,apache 会去掉多余的斜线。除非你喜欢让 apache 做更多的工作,否则你不需要斜线。话虽如此,我确实更新了我的原始答案以使用 %{REQUEST_URI} 而不是 %1 因为它更能揭示意图。
    • @wilmoore: that's correct when the options are placed in the server configuration file, as the rewrite engine can hook URL-to-filename-translation.但是,当放置在per-directory 配置文件中时,在重写引擎介入时,URI 已经映射到路径名。重写引擎通过剥离目录前缀来处理这个问题,这最终会删除前导的“/” ,并与结果匹配。
    • @wilmoore:在“%{REQUEST_URI}”之前没有“/”实际上很好,它包含原始请求 URI,并且不会被重写引擎更新。由于 Juhani 所述的原因,我试图指出“$1”在每个目录的上下文中是不正确的。因此,您的第一个更改不仅使意图更清晰,还纠正了 Juhani 提到的错误。如果没有“%{REQUEST_URI}”,则必须使用RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]。抱歉,我的评论引起了一些混乱。
    • @outis,谢谢...我已经有一段时间不用处理 Apache 服务器了,所以无法进行测试。感谢您的安慰。
    【解决方案4】:

    this answer 中所述,修复您的应用程序以在需要时使用https:// 链接。不要依赖自动重定向,如果您还没有通过https:// 将链接/表单提供给https:// URL,这可能会导致您产生错误的安全感。自动使用mod_rewrite 会增加检测此类错误(也可能是漏洞)的难度。

    【讨论】:

      【解决方案5】:

      我在 wordpress 中的管理文件夹中使用了类似的东西:

      #redirect all https traffic to http, unless it is pointed at /checkout
      RewriteCond %{HTTPS} on
      RewriteCond %{REQUEST_URI} !^/checkout/?.*$
      RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L]
      

      RewriteCond %{HTTPS} on 部分可能不适用于所有 Web 服务器。例如,我的虚拟主机需要 RewriteCond %{HTTP:X-Forwarded-SSL} on

      如果你想强制反转,试试:

      #redirect all http traffic to https, if it is pointed at /checkout
      RewriteCond %{HTTPS} off
      RewriteCond %{REQUEST_URI} ^/checkout/?.*$
      RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L]
      

      如果您想要一些替代方法,请查看askapache

      【讨论】:

      • 我检查了我服务器上的代码,使用上面列出的两个块,它工作正常,没有重定向循环。
      • +1。很好的答案。在我的情况下需要RewriteCond %{HTTP:X-Forwarded-SSL} on,因为我使用的是 RackSpace 的云站点。
      • @wilmoore's 建议使用%{SERVER_NAME} 添加会有用
      • 我不得不使用这个检查来让它工作RewriteCond %{HTTP:X-Forwarded-Proto} !https
      【解决方案6】:

      我认为应该是:

      RewriteCond %{HTTPS}  =on
      ^/checkout(.*) http://shoppingsite.com/checkout$1 [R]
      

      请参阅mod_rewrite 文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        • 2011-10-20
        • 2012-08-17
        • 1970-01-01
        • 2010-10-13
        • 2011-08-16
        • 2012-05-14
        相关资源
        最近更新 更多