2010-07-13 96 views
19

我想重定向去http://example.comhttps://example.com需要重定向所有流量到https

同任何流量http://example.com/about

我认为这将是这样的:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC] 
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L] 
+1

如果您不想使用您的实际域名,请针对所有域名问题使用example.com。 – animuson 2010-07-13 17:31:09

+0

可能重复的[如何将所有HTTP请求重定向到HTTPS](http://stackoverflow.com/questions/4083221/how-to-redirect-all-http-requests-to-https) – Sadurnias 2016-02-11 06:12:55

回答

50

这适用于我:

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

如果流量通过非SSL HTTP进入,则重定向到用户最初尝试访问的任何页面的HTTP等效项。它也不涉及任何mod_rewrite选项,所以它很容易阅读。为什么大家都觉得需要明确设置重定向的HTTP代码,并将其中一个重写标记为“最后一个”?说真的,在过去的几天里我看到了几十个相同的htaccess规则。

+2

我认为如果重写是“纠正”动作,301响应可能比默认的302响应更合适,并且需要明确的声明。就'L'而言,如果不再有任何进一步的规则匹配,就没有必要了,但是如果这样做的话,通过擦除新的方案/主机信息可以很容易地阻止重定向。考虑到大多数人“忘记”一半时间发布其他规则集,这是更安全的选择。如果没有更多的规则,我同意这只是混乱,我真的不明白,当他们在文件中唯一的规则使用它... – 2010-07-13 19:23:18

+1

虽然这似乎工作,这是错误的:这因为这依赖于客户端发送的“主机”头。此外,主机头还可以包含端口:因此,如果客户端请求中的主机头包含端口:80,则该位置将具有端口:80,其中包含https,这是错误的。请参阅http://serverfault.com/questions/814153/apache-returning-wrong-location-header。从t-richards http://stackoverflow.com/a/27930928/1504300的答案似乎更好 – reallynice 2016-11-10 09:12:35

+0

@reallynice你可以硬编码主机头,以及?对于只有一个的服务器。通常你可能没有访问服务器主配置文件,但你有.htaccess权限,所以在这种情况下,我只是使用它,但硬编码主机。 – eis 2017-01-15 15:24:39

7

根据Apache documentation,对于此任务,使用mod_aliasmod_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. 请记住,mod_rewrite指令是在mod_alias指令之前处理的。如果您的.htaccess文件中已有大量RewriteRule s,则最好使用mod_rewrite配置。
+0

在我的情况下,“重定向永久”必须是:'重定向永久http://www.example.com https:// www.example.com',否则在浏览器中我得到一个循环错误 – 2017-05-12 10:11:22

8

这是一个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}在使用http时未设置为off,但为空,因此!onoff更可靠。
  • 对于显式主机名,您不依赖客户端主机头或服务器配置。但是,显式主机名称通常假定只有一个域要重定向。主机头带来一些相当大的问题,例如包含端口和客户端提供的数据。如Apache Wiki所建议的另一种替代方案是使用%{SERVER_NAME}。如果你考虑使用它,请检查this discussion的警告 - 它依赖于其他配置是正确的。
  • R=301表示它是永久重定向,因为它通常意味着在这种情况下。如果您认为这是暂时的,那么可以省略或指定为R=302
  • L表示它是应用于此请求的最后一条规则。如果您怀疑或知道在此之后还有其他规则您不想申请,请留下它。如果这是文件的唯一规则,您可以删除它。
相关问题