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

Cat*_*Cat 282 security .htaccess https redirect http

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

ssc*_*ssc 330

Apache的文档建议不要使用重写:

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

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

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

该段应进入主服务器配置文件,.htaccess如问的问题.

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

  • 这是一个很好的提示.但是在[Apache doc](http://httpd.apache.org/docs/2.4/rewrite/avoid.html)中也提到:"在http-to-https重定向的情况下,使用RewriteRule将是适当的,如果您无权访问主服务器配置文件,并且有义务在.htaccess文件中执行此任务." 对我来说是这样的...... (45认同)
  • 这应该是目前的答案.但究竟什么在"SSL配置"?一个完整的例子将非常有用. (9认同)
  • 我在哪里可以找到主服务器*配置文件* (8认同)
  • @Ben:这是一个在线广泛记录的不同问题; 顺便说一句,我昨天刚刚添加了一个几乎完整的例子:http://serverfault.com/q/597012/26210,这可能会让你知道SSL配置中的内容 (6认同)
  • @ user1844933如果你使用`permanent`关键字,效果是一样的(浏览器收到301重定向).例如:`Redirect permanent"/""https://example.com"` (4认同)
  • @Whitecat在Centos 6中,文件位于/etc/httpd/conf/httpd.conf (2认同)

Ree*_*ore 293

更新:虽然几年前这个答案已被接受,但请注意,Apache文档现在建议不要使用它的方法.请Redirect改用.看到这个答案.


RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Run Code Online (Sandbox Code Playgroud)

资源

  • @Cat,正如我在回答/评论中所说,如果你想"将所有不安全的HTTP [...]重定向到HTTPS",这种方法不会使这些请求安全,它只会让浏览器制作它们两次,一次不安全,一次安全. (23认同)
  • 你真正应该做的是使用[HSTS](https://tools.ietf.org/html/rfc6797)与此一致. (12认同)
  • 他们并不一定建议这样做:`对于http到https重定向,如果您无权访问主服务器配置文件并且必须执行此任务,则使用RewriteRule是适当的。而是在.htaccess文件中。 (6认同)
  • 在我工作,所以RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R = 301] (5认同)
  • 你的措辞太强烈了,对这个答案的谴责。在该链接中,Apache 说:“如果出于某种原因,您仍然想使用 `mod_rewrite`...您可能会使用”。当然,如果您无权访问服务器配置(99% 的用户),那么这个答案很好。 (4认同)
  • 这可能是我的apache版本(Centos 7中打包的2.4.6)中的错误,但这在某些URL上对我来说是个问题。例如,“ http:// server / foo?email = someone%40example.com”重定向到“ https:// server / foo?email = someone%2540example.com”,即“ @”符号的URL引用*两次*。使用@ssc答案中的方法不会出现此问题。 (2认同)
  • 错误的答案。它将仅重定向基本URL,而不重定向子文件夹中的URL。RewriteRule(。*)https://%{HTTP_HOST}%{REQUEST_URI} [R = 301,L]是正确的答案 (2认同)

Dav*_*vid 136

我建议使用301重定向:

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

  • 谢谢,这对我有用,接受的答案不是......可能是由于缺少`[L]` (7认同)
  • 所有答案都缺少一件事 - 如果您希望将所有页面重定向到https,则任何重定向代码都必须放在.htaccess文件的开头,其他任何内容之前. (3认同)
  • 同样在这里.为我工作.接受的答案没有 (2认同)

Bru*_*uno 35

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

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

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

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

  • @Daniel,我同意当用户输入网址时要宽大是有用的.我说这是在开发/测试期间关闭此功能但在生产(或开发/测试的最后阶段)中启用它的情况之一. (4认同)

小智 18

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

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)


Tim*_*ene 14

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

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />
Run Code Online (Sandbox Code Playgroud)

PHP方法

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

.htaccess approch

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Run Code Online (Sandbox Code Playgroud)

复制自: www.letuslook.org


Cor*_*ory 8

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

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


Ope*_*War 6

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

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Run Code Online (Sandbox Code Playgroud)

如果您有一个.htaccess文件:

不要复制RewriteEngine On.

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


Ana*_*law 5

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

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

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


mai*_*kel 5

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

如果您使用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>
Run Code Online (Sandbox Code Playgroud)

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

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

如果您寻找PHP解决方案,请查看$ _SERVER数组标头函数:

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