it-swarm.cn

如何将所有HTTP请求重定向到HTTPS

我正在尝试将我网站上所有不安全的HTTP请求(例如http://www.example.com)重定向到HTTPS(https://www.example.com)。我正在使用PHP btw。我可以在.htaccess中执行此操作吗?

266
Cat

更新: 虽然几年前这个答案已经被接受了,但请注意它的方法是 现在建议 由Apache文档提供。请改用Redirect。见 这个答案


RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

资源

273
Reese Moore

Apache docs 建议不要使用重写:

要将http网址重定向到https,请执行以下操作:

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

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

这段代码应该按照问题中的要求进入主服务器配置文件 not into .htaccess

这篇文章可能只是在提出问题并得到回答后提出,但似乎是目前的方法。

315
ssc

我建议使用301重定向:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
126
David

正如我在 这个问题中所说的那样 ,我建议你不要盲目地将所有HTTP请求重定向到他们的HTTPS等价物,因为它可能会给你一个错误的安全印象。相反,您应该将HTTP站点的“根”重定向到HTTPS站点的根目录,并从那里链接到HTTPS。

问题是,如果HTTPS站点上的某些链接或表单使客户端向HTTP站点发送请求,则在重定向之前,其内容将是可见的。

例如,如果通过HTTPS提供的某个页面有一个表示<form action="http://example.com/doSomething">的表单并发送一些不应以明文形式发送的数据,则浏览器将首先将完整请求(包括实体,如果它是POST)发送到HTTP网站第一。重定向将立即发送到浏览器,并且由于大量用户禁用或忽略警告,因此可能会被忽略。

当然,提供应该连接到HTTPS站点但最终用于HTTP站点的链接的错误可能会在您使用与HTTPS站点相同的IP地址上的HTTP端口上侦听某些内容时导致问题。但是,我认为将两个站点保持为“镜像”只会增加出错的可能性,因为您可能倾向于假设它会通过将用户重定向到HTTPS来自动纠正自身,而这通常为时已晚。 (在 这个问题中有类似的讨论。

34
Bruno

我发现https和www在域上的最佳方式是

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_Host} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
17
GiorgosK

这是它工作的html重定向方法,但不是最好的。

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

PHP方法

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess approch

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

复制自: www.letuslook.org

13
Timothy Nwanwene

我喜欢这种从http重定向到https的方法。因为我不需要为每个站点编辑它。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
8
Cory

使用.htaccess文件中的以下代码会自动将访问者重定向到您网站的HTTPS版本:

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

如果您有一个.htaccess文件:

不要复制RewriteEngine On。

确保以RewriteCond和RewriteRule开头的行紧跟现有的RewriteEngine On。

6
OpenWebWar

根据GoDaddy.com,这是使用.htaccess将HTTP重定向到HTTPS的正确方法。第一行代码是不言自明的。第二行代码检查HTTPS是否已关闭,如果是,则通过运行第三行代码将HTTP重定向到HTTPS,否则将忽略第三行代码。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828

5
AnarchyOutlaw

最佳解决方案取决于您的要求。这是先前发布的答案的摘要,其中添加了一些上下文。

如果您使用Apache Web服务器并可以更改其配置,请按照 Apache文档

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

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

但是你也问过你是否可以在.htaccess文件中做到这一点。在这种情况下,您可以使用Apache的 RewriteEngine

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [L]

如果一切正常并且您希望浏览器记住此重定向,则可以通过将最后一行更改为:来将其声明为永久性:

RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

但是如果你可以改变这种重定向的想法,请小心。浏览器会记住它很长时间,并且不会检查它是否发生了变化。

您可能不需要第一行RewriteEngine On,具体取决于Web服务器配置。

如果你找一个PHP解决方案,请查看 $ _SERVER数组header函数

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI']); 
} 
5
maikel

执行上面解释的所有内容以进行重定向。只需在标题中添加“HTTP严格传输安全性”即可。这样可以避免中间人攻击。

编辑Apache配置文件(例如/etc/Apache2/sites-enabled/website.conf和/etc/Apache2/httpd.conf)并将以下内容添加到VirtualHost:

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security

4
Waqas

将以下代码添加到.htaccess文件中:

Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]

哪里[您的域名]是您网站的域名。

您还可以通过将上面代码的最后一行替换为您的域名来重定向特定文件夹:

RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
4
Rahul

要将所有http请求重定向到https,您可以使用:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [NE,L,R]

如果未启用mod-rewrite且您使用的是Apache 2.4,则还可以在Redirect指令内使用ifhttp请求重定向到https

Apache 2.4。

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
2
starkeen

如果您处于无法直接访问您的站点的Apache配置的情况下,许多托管平台仍然以这种方式受到限制,那么我实际上建议采用两步法。 Apache自己的原因是你应该首先使用他们的配置选项,而不是首先使用mod_rewrite来实现HTTP到HTTPS。

首先,如上所述,您将设置.htaccess mod_rewrite规则:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

然后,在您的PHP文件中(您需要在适合您的情况的情况下执行此操作,某些站点将通过单个PHP文件汇集所有请求,其他根据他们的需求和提出的要求提供各种页面):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

以上需要在任何可能在不安全的环境中暴露安全数据的代码之前运行。因此,您的站点通过HTACCESS和mod_rewrite使用自动重定向,而您的脚本确保在不通过HTTPS访问时不提供输出。

我猜大多数人都不这么认为,因此Apache建议你尽可能不使用这种方法。但是,它只需要对开发端进行额外检查,以确保用户的数据安全。希望这可以帮助其他人因为我们的托管服务端限制而不得不考虑使用非推荐的方法。

2
F. Scott Gale

通过.htaccess这将有所帮助。

RewriteEngine On


RewriteBase /
RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

另外,请参阅此更多详细信息。 如何将Http重定向到Https?

1
Roshan Padole

除非你需要mod_rewrite用于其他事情,否则使用Apache核心IF指令更干净,更快:

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

您可以向IF指令添加更多条件,例如确保没有www前缀的单个规范域:

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

将mod_rewrite用于一切都有很多熟悉的惯性,但看看这是否适合你。

更多信息: https://httpd.Apache.org/docs/2.4/mod/core.html#if

要查看它的实际效果(尝试不使用www。或https://,或使用.net而不是.com): https://nohodental.com/ (我正在处理的网站)。

1
SashaK

如果您使用的是Apache,mod_rewrite是最简单的解决方案,并且在线有很多文档如何做到这一点。例如: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

0
vcsjones

此问题的另一个边缘是负载均衡器发挥作用。

情况如下: - 从浏览器到Load Balancer的流量,然后返回,是(应该是)HTTPS - Load Balancer和实际WebServer之间的流量是HTTP。

因此,PHP或Apache中的所有服务器请求变量都表明连接只是HTTP。并且服务器上的HTTP和HTTPS目录是相同的。

批准的答案中的RewriteCondition不起作用。它给出一个循环或它只是不起作用。

问题是:如何使用Load Balancer。

(或者Load Balancer配置错误。这是我希望的,因为那时我可以将问题转移到WebHosting公司:-))

0
BertC

把这段代码带给你.htaccess文件 自动将HTTP重定向到HTTPS

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

0
Ehsan Sattari

这个对我有用:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
</IfModule>

例如, http:// server/foo?email = someone%40example.com 正常重定向没有任何问题。文件.htaccess位于网站根文件夹中(例如名为public_html)。可以使用RewriteCond%{SERVER_PORT}!^ 443 $而不是RewriteCond%{HTTPS}!on

0
Intacto
 Redirect 301 / https://example.com/

(当上述答案都没有奏效时,为我工作)

奖金:

ServerAlias www.example.com example.com

(已修复https:// www .example.com未找到)

0
aalesund

我找到了一种方法来强制我的网站的所有页面从http重定向到https上的页面模拟,这对我有用。

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
0
Oleg Apanovich

如果您使用的Amazon Web Services Elastic Load Balancer接受https流量并使用http将其路由到您的服务器,则此处描述了将所有http流量重定向到https的正确方法: https:// aws。 Amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb

使用X-Forwarded-Proto标头(包含http或https),它始终包含在负载均衡器的http请求中,如下所述: https://docs.aws.Amazon.com/elasticloadbalancing/latest/classic/ x-forwarded-headers.html

在httpd.conf文件中:

<VirtualHost *:80>

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

</VirtualHost>

或者在你的root .htaccess文件中:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

奖励:它不会尝试重定向本地开发计算机上的http流量。

0
ScottyB