繁体   English   中英

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

[英]How to redirect all HTTP requests to HTTPS

I'm trying to redirect all insecure HTTP requests on my site (eg http://www.example.com ) to HTTPS ( https://www.example.com ). 如何在.htaccess文件中执行此操作?

顺便说一句,我正在使用PHP

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

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

 <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 文档现在不推荐使用它的方法。 改用Redirect 看到这个答案


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

我建议使用 301 重定向:

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

正如我在这个问题中所说的那样,我建议您避免盲目地将所有 HTTP 请求重定向到其等效的 HTTPS,因为这可能会给您带来安全的错误印象。 相反,您可能应该将 HTTP 站点的“根”重定向到 HTTPS 站点的根并从那里链接到 HTTPS。

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

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

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

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

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

这是它的 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 方法

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

复制自: www.letuslook.org

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

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

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

如果您使用 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

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

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

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

RewriteEngine On

RewriteCond %{HTTPS} off

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

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

不要复制 RewriteEngine On。

确保以 RewriteCond 和 RewriteRule 开头的行紧跟在已经存在的 RewriteEngine On 之后。

根据 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

将以下代码添加到 .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]

执行上面解释的所有重定向操作。 只需将“HTTP Strict Transport Security”添加到您的标头即可。 这将避免中间人攻击。

编辑您的 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

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

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

如果未启用 mod-rewrite 并且您使用的是 apache 2.4,您还可以在if指令中使用Redirecthttp请求重定向到https

阿帕奇 2.4。

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

如果您处于无法直接访问站点的 apache 配置的情况,许多托管平台仍然以这种方式受到限制,那么我实际上建议采用两步法。 Apache 自己记录您应该首先使用他们的配置选项的原因,而不是用于 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 使用自动重定向,而您的脚本确保在未通过 HTTPS 访问时不提供任何输出。

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

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

将此代码带给您 .htaccess 文件自动将 HTTP 重定向到 HTTPS

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

以上内容仅适用于 Apache 服务器。 如果在 tomcat 上运行 PHP 会怎样?

所以你可以使用PHP代码,无论是Apache/tomcat/Nginx等...

if (!((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
    $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))){
    $redirect = 'https://' . str_replace($_SERVER['SERVER_PORT'], 8443, $_SERVER['HTTP_HOST']) . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirect);
    exit();
}

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

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

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 Redirect 301 / https://example.com/

(当上述答案都不起作用时对我有用)

奖金:

ServerAlias www.example.com example.com

(固定 https:// www .example.com 未找到)

这会将所有 URL 重定向到 https 和 www

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

如果您想从 tomcat 服务器执行此操作,请按照以下步骤操作

在独立的 Apache Tomcat (8.5.x) HTTP 服务器中,如何配置它以便如果用户键入 www.domain.com,他们将被自动转发到 https(www.domain.com) 站点。

在您的 [Tomcat_base]/conf/web.xml 结束标记前包含以下内容的 2 步方法

step 1: 
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

并设置 [Tomcat_base]/conf/server.xml 连接器设置:

step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>

注意:如果您已经进行了 https 配置并尝试重定向,请仅执行步骤 1。

您不仅可以在 .htaccess 文件中执行此操作,还应该在此期间执行此操作。 在实施此重定向后,您还需要按照此处的步骤将您的站点列在 HSTS 预加载列表中,以便对您网站的不安全 http 版本的任何请求都不会通过用户代理。 相反,用户代理根据只包含 https 的网站列表检查请求的 URI,如果请求的 URI 在该列表中,则在将请求传输到服务器之前将协议从 http 更改为 https。 因此,不安全的请求永远不会公开,也永远不会命中服务器。 最终,当 Internet 切换到 https 时,将不再需要 HSTS 预加载列表。 在那之前,每个站点都应该使用它。

为了执行重定向,我们需要启用重写引擎,然后将所有流量从 http 端口 80 重定向到 https。

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://yourwebsite.tld/$1 [L,R=301]

我尝试了所有可以在互联网上找到的.htaccess配置,但都没有。 然后,我意识到Apache不鼓励使用mod_rewrite

我的解决方案是编辑以下文件夹下的 apache 配置文件: /etc/apache2/sites-enabled

您将拥有一个名为000-default.conf强制文件和一个名为000-default-le-ssl.conf的 ssl 配置文件(如果您已从letsencrypt/certbot 安装了 ssl 证书)。 但是,根据您在设置站点时提供的文件名,可以对这些文件进行不同的命名。

000-default.conf ,我在<VirtualHost *:80>编辑了以下内容:

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

000-default-le-ssl.conf ,我在<VirtualHost *:80>编辑了以下内容:

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

不需要其他重定向。

保存文件,然后使用sudo service apache2 restart apache 服务器

经过多次尝试,考虑没有 www 和 www 这可以工作

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} (www\.)?yourdomain.com
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

我实际上是想让它在没有负载均衡器的情况下在 EC2 实例上工作,因为这需要花钱。 我到处都读到 .htaccess 不是“正确”的方法。 显然,它会起作用,但我试图按部就班。 我按照所有示例来更新 httpd.conf 文件并添加了很多不必要的东西。 事实证明,您真正需要的唯一一行是:

Redirect permanent / https://www.yourdomain.com

我的问题是,最初我在 httpd.conf 的 VirtualHost 标记中添加了它,这是很多帖子告诉你的,但它不起作用。 事实证明,在 /etc/httpd/conf.d 中存储了一个名为 yourdomain.conf 的单独 conf 文件,它已经具有 VirtualHost 标签并覆盖了我的 httpd.conf 设置。 我刚刚在其中添加了上面的行,瞧,它立即重定向到 https。 端口 443 不需要单独的 VirtualHost。

它现在可以工作了,VirtualHost 标签看起来像这样:

<VirtualHost *:80>
    ServerName yourdomain.com
    DocumentRoot /var/www/html
    ServerAlias www.yourdomain.com
    ErrorLog /var/www/error.log
    CustomLog /var/www/requests.log combined
    Redirect permanent / https://www.yourdomain.com
</VirtualHost>

注意:我已经使用来自 certbot 的免费证书设置了 TLS(爱那些家伙),并且只是试图将常规 http 调用重定向到工作 https 站点。

这个问题的另一个优势是负载均衡器开始发挥作用。

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

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

已批准答案中的 RewriteCondition 不起作用。 它要么提供一个循环,要么就是不起作用。

问题是:如何让它在负载均衡器上工作。

(或者是负载均衡器配置错误。这是我所希望的,因为这样我就可以将问题转移到 WebHosting 公司 :-) )

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

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

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

在 httpd.conf 文件中:

<VirtualHost *:80>

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

</VirtualHost>

或者在您的根 .htaccess 文件中:

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

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

这个对我有用:

<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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM