需要将所有流量重定向到 https
Posted
技术标签:
【中文标题】需要将所有流量重定向到 https【英文标题】:Need to redirect all traffic to https 【发布时间】:2011-03-15 11:04:37 【问题描述】:我想将任何流向 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]
【问题讨论】:
如果您不想使用您的实际域,请使用 example.com 解决所有域问题。 How to redirect all HTTP requests to HTTPS的可能重复 【参考方案1】:这对我有用:
RewriteEngine on
RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI
如果流量通过非 SSL HTTP 传入,则重定向到用户最初尝试访问的任何页面的 HTTP 等效项。它也不涉及任何 mod_rewrite 选项,因此易于阅读。
旁白:为什么每个人都觉得有必要明确设置重定向的 HTTP 代码并将他们的重写标记为“最后一次”?说真的,在过去的几天里,我已经看到了几十个看起来相同的 htaccess 规则。
【讨论】:
我认为如果重写是“纠正”动作,301 响应可能比默认的 302 响应更合适,并且需要明确声明。就L
而言,如果您没有任何进一步的规则匹配,则没有必要,但如果您这样做,则可以通过删除新的方案/主机信息来轻松阻止重定向。考虑到大多数人有一半时间“忘记”发布规则集的其余部分,这是更安全的选择。如果没有更多规则,我同意这只是混乱,当他们在文件中唯一的规则上使用它时我真的不明白......
虽然这似乎可行,但这是错误的:因为这依赖于客户端发送的“主机”标头。此外,主机标头还可以包含端口:因此,如果客户端请求中的主机标头包含端口:80,则 Location 将具有端口:80,带有 https,这是错误的。见serverfault.com/questions/814153/…。 t-richards ***.com/a/27930928/1504300 的答案似乎更好
@reallynice 您也可以硬编码 Host 标头,对吧?对于只有一台的服务器。通常你可能无法访问服务器主配置文件,但你有 .htaccess 权限,所以在这些情况下,我只使用它,但对主机进行硬编码。
在 Apache 官方文档中建议不要这样做,即“何时不使用 mod_rewrite”:httpd.apache.org/docs/2.4/rewrite/avoid.html,因此我也更喜欢 t-richards 的回答【参考方案2】:
这是 previous answer using .httaccess,但添加了 cmets 中提出的更改,其中一些来自我:
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
,而是为空,所以!on
是比off
更可靠的规则。
对于显式主机名,您不依赖客户端主机标头或服务器配置。但是,显式主机名自然假定只有一个域需要重定向。主机头会带来一些相当大的问题,例如包含端口和客户端提供的数据。正如Apache Wiki 所建议的,另一种选择是使用%SERVER_NAME
。如果您考虑使用它,请查看 this discussion 的警告 - 它依赖于其他配置是否正确。
R=301
表示它是永久重定向,因为它通常意味着在这种情况下。如果您认为它是暂时的,可以省略或指定为 R=302
。
L
表示这是应用于此请求的最后一条规则。如果您怀疑或知道在此之后还有其他您不想应用的规则,请留下它。如果这是文件的唯一规则,您可以删除。
【讨论】:
【参考方案3】:根据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 >
关于此配置需要注意两点:
-
您需要访问主服务器配置文件才能使此配置生效。
VirtualHost
指令仅在“服务器配置”上下文中有效。
请记住,mod_rewrite
指令在 mod_alias
指令之前处理。如果您的.htaccess
文件中已经有大量的RewriteRule
s,那么使用mod_rewrite
配置可能会更好。
【讨论】:
在我的情况下,“永久重定向”必须是:Redirect permanent http://www.example.com https://www.example.com
否则在浏览器中会出现循环错误【参考方案4】:
为什么不简单明了?
rewriteCond %HTTPS !on
rewriteRule ^(.*)$ https://%SERVER_NAME%REQUEST_URI [R,L]
它对我有用,在我看来很清楚。干杯。
【讨论】:
我的首选方法也是,可以很好地推送到存储库,因为开发人员经常在不同的虚拟主机上设置站点。【参考方案5】:在所有条件下工作是:
<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>
【讨论】:
【参考方案6】:经过一些研究,这对我有用,有点不同的版本。
RewriteEngine On
RewriteCond %HTTPS off
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]
【讨论】:
以上是关于需要将所有流量重定向到 https的主要内容,如果未能解决你的问题,请参考以下文章
我想将所有流量重定向到http://www.mywebsite.com