代码之家  ›  专栏  ›  技术社区  ›  Brad

需要将所有流量重定向到HTTPS

  •  28
  • Brad  · 技术社区  · 14 年前

    我想把所有的流量重定向到 http://example.com https://example.com

    同样 http://example.com/about https://example.com/about

    我想应该是这样的:

    RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
    RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
    
    6 回复  |  直到 6 年前
        1
  •  64
  •   Borealid    14 年前

    这对我很有用:

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

    如果流量是通过非SSL HTTP传入的,那么重定向到与用户最初尝试访问的页面相同的HTTP。它也不涉及任何修改选项,所以很容易阅读。

    旁白:为什么每个人都觉得需要显式地设置重定向的HTTP代码,并将其中一个重写标记为“最后一个”代码?说真的,在过去的几天里,我看到了许多看起来相同的htaccess规则。

        2
  •  12
  •   eis    6 年前

    这是一个 previous answer using .httaccess 但是在评论中增加了一些建议,还有一些来自我的:

    RewriteEngine on
    RewriteBase /
    RewriteCond %{HTTPS} !on
    RewriteRule (.*) https://my.domain.name%{REQUEST_URI} [L,R=301]
    

    笔记:

    • 这适用于用户不能访问主配置,但可以访问.htaccess规则的情况。如果您可以访问主配置,请使用 mod_alias solution instead .
    • 对我来说,没有定义rewritebase,规则就没有被采纳。显式定义它可以消除某些服务器设置的模糊性。
    • 至少在某些配置上, %{HTTPS} 未设置为 off 使用HTTP时,但为空,因此 !on 比…更可靠的规则 远离的 .
    • 对于显式主机名,您不依赖客户端主机头或服务器配置。然而,显式主机名自然地假定只有一个域可以重定向。主机头存在一些相当大的问题,例如包含端口和被客户机提供的数据。另一种选择,如 Apache Wiki 是使用 %{SERVER_NAME} . 如果您考虑使用它,请查看 this discussion -它依赖于其他正确的配置。
    • R=301 这意味着它是永久性的重定向,在本例中通常是这样。如果你认为这是暂时的,可以省略或指定为 R=302 .
    • L 表示这是最后一条应用于此请求的规则。如果你怀疑或知道在这之后还有其他规则你不想被应用的话就离开它。如果这是文件的唯一规则,则可以删除。
        3
  •  7
  •   t-richards    10 年前

    根据 Apache documentation 使用 mod_alias mod_rewrite 为了这个任务。也就是说,为了将所有HTTP通信重定向到HTTPS,可以:

    <VirtualHost *:80>
        ServerName www.example.com
        Redirect permanent / https://www.example.com/
    </VirtualHost >
    
    <VirtualHost *:443>
        ServerName www.example.com
        # ... SSL configuration goes here
    </VirtualHost >
    

    关于此配置需要注意两件事:

    1. 您需要访问主服务器配置文件才能使此配置工作。这个 VirtualHost 指令仅在“服务器配置”上下文中有效。
    2. 记住 MODY重写 指令在之前处理 莫代利亚斯 指令。如果你已经有了一大块 RewriteRule 你的S .htaccess 文件,你最好 MODY重写 配置。
        4
  •  1
  •   Andres Felipe    6 年前

    为什么不简单明了呢?

    rewriteCond %{HTTPS} !on
    rewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
    

    这对我很有效,在我看来很清楚。干杯。

        5
  •  0
  •   Fabio de Oliveira    6 年前

    经过一些研究,这对我有点作用,有点不同的版本。

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
        6
  •  0
  •   Raghbendra Nayak    6 年前

    在所有条件下工作是:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    
    RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [NE,L,R=301]
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] 
    
    <IfModule>