如何将所有HTTP请求redirect到HTTPS

我试图将我网站上的所有不安全的HTTP请求(例如http://www.example.com )redirect到HTTPS( https://www.example.com )。 我使用PHP btw。 我可以在.htaccess中做到这一点吗?

更新:虽然这个答案已经在几年前被接受了,但是请注意, 现在的方法是被Apache文档推荐的 。 使用Redirect 。 看到这个答案 。


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

资源

Apache文档build议不要使用重写:

要将http URLredirect到https ,请执行以下操作:

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

这个片段应该进入主服务器configuration文件, 而不是问题中提到的.htaccess

这篇文章可能只是在问题被提出并回答之后才提出,但似乎是目前的路要走。

我build议301redirect:

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

正如我在这个问题中所说的那样,我build议你避免将所有的HTTP请求盲目地redirect到它们的HTTPS,因为这可能会导致你错误的安全印象。 相反,您应该将HTTP站点的“根目录”redirect到HTTPS站点的根目录,并从那里链接到HTTPS。

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

例如,如果您通过HTTPS提供的某个网页具有<form action="http://example.com/doSomething">的forms,并发送了一些不应该清晰发送的数据,则浏览器将首先发送首先向HTTP站点提交完整的请求(包括实体,如果是POST)。 redirect将立即发送到浏览器,由于大量用户禁用或忽略警告,因此很可能会被忽略。

当然,提供应该连接到HTTPS站点的链接,但是最终连接到HTTP站点的错误可能会导致问题,只要您在与HTTP HTTPS站点相同的IP地址上的HTTP端口上进行了监听。 但是,我认为将这两个网站保持为“镜像”只会增加犯错的几率,因为您可能会倾向于假定它将通过将用户redirect到HTTPS来自动纠正自己,而往往为时已晚。 ( 这个问题有类似的讨论。 )

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

 RewriteCond %{HTTPS} off RewriteCond %{HTTPS_HOST} !^www.cheapcarhire.gr$ [NC] RewriteRule ^(.*)$ https://www.cheapcarhire.gr/$1 [L,R=301] 

我喜欢这种从httpredirect到https的方法。 因为我不需要为每个网站进行编辑。

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

这是它的工作,但不是最好的HTMLredirect的方法。

  <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接受

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

复制自www.letuslook.org

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

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

如果您有一个现有的.htaccess文件:

不要复制RewriteEngine。

确保以RewriteCond和RewriteRule开始的行紧跟已有的RewriteEngine On。

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

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

你的域名是你网站的域名。

您也可以通过将以上代码的最后一行replace为您的域名来redirect特定的文件夹:

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

根据GoDaddy.com,这是使用.htaccess将HTTPredirect到HTTPS的正确方法。 第一行代码是不言自明的。 第二行代码检查HTTPS是否closures,如果是,则通过运行第三行代码将HTTPredirect到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

最好的解决scheme取决于你的要求。 这是添加了一些上下文的以前发布的答案的摘要。

如果您使用Apache Web服务器并可以更改其configuration,请遵循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] 

如果一切工作正常,你想让浏览器记住这个redirect,你可以通过将最后一行改为:

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

但要小心,如果你可以改变你的想法在这个redirect。 浏览器记住它很长一段时间,不会检查它是否改变。

根据Web服务器的configuration,您可能不需要第一行RewriteEngine On

如果你寻找一个PHP解决scheme,看$ _SERVER数组和头函数 :

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

做所有上面解释的redirect。 只需将“HTTP严格传输安全性”添加到您的标题。 这将避免中间人的攻击。

编辑你的apacheconfiguration文件(例如/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

通过.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] 

此外,请参阅此更多详细信息。 如何将Httpredirect到https?

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

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

如果mod-rewrite没有启用,并且你在apache 2.4上,你也可以使用if里面的Redirectredirecthttp请求到https

Apache 2.4。

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

除非你需要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/ (我正在工作的网站)。

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

负载平衡器进场时,这个问题的另一个边缘。

情况如下: – 从浏览器到负载平衡器的stream量,返回(应该是)HTTPS – 负载平衡器和实际WebServer之间的stream量是HTTP。

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

核准答案中的RewriteCondition不起作用。 它提供了一个循环或它只是不工作。

问题是:如何让这个负载平衡器工作。

(或者负载平衡器configuration错误,我期望的是哪一个,因为我可以把这个问题转移到WebHosting公司:-))

如果您处于无法直接访问您的站点的apacheconfiguration的情况,那么许多托pipe平台仍然以这种方式受到限制,那么我实际上会推荐两步法。 Apache本身为什么要logging你应该首先使用它们的configuration选项,而不是使用HTTP到HTTPS的mod_rewrite。

首先,如上所述,您将设置您的.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使用自动redirect,而您的脚本确保在不通过HTTPS访问时不提供输出。

我想大多数人不这样想,所以Apachebuild议你不要在可能的情况下使用这种方法。 但是,只需要在开发结束时进行额外的检查,以确保用户的数据安全。 希望这可以帮助其他人,因为我们的托pipe服务的限制,可能需要考虑使用非推荐的方法。