我正在尝试将我网站上所有不安全的HTTP请求(例如http://www.example.com
)重定向到HTTPS(https://www.example.com
)。我正在使用PHP顺便说一句。我可以在.htaccess中执行此操作吗?
答案 0 :(得分:316)
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>
此问卷片段应按照问题中的要求进入主服务器配置文件 进入.htaccess
。
这篇文章可能只是在提出问题并得到回答后提出,但似乎是目前的方法。
答案 1 :(得分:273)
更新:虽然几年前这个答案已被接受,但请注意Apache文档的方法是now recommended against。请改用Redirect
。请参阅this answer。
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
答案 2 :(得分:127)
我建议使用301重定向:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
答案 3 :(得分:35)
正如我在this question中所说的那样,我建议你不要盲目地将所有HTTP请求重定向到他们的HTTPS等价物,因为它可能会给你一个错误的安全印象。相反,您应该将HTTP站点的“根”重定向到HTTPS站点的根目录,并从那里链接到HTTPS。
问题是,如果HTTPS站点上的某些链接或表单使客户端向HTTP站点发送请求,则在重定向之前,其内容将可见。
例如,如果您通过HTTPS投放的某个网页的表单显示为<form action="http://example.com/doSomething">
并发送了一些不应以明文形式发送的数据,则浏览器将首先发送完整请求(包括实体,如果它首先是HTTP站点的POST)。重定向将立即发送到浏览器,由于大量用户禁用或忽略警告,因此可能会被忽略。
当然,提供应该连接到HTTPS站点但最终用于HTTP站点的链接的错误可能会导致问题,只要您在与HTTPS相同的IP地址上的HTTP端口上侦听某些内容现场。但是,我认为将两个站点保持为“镜像”只会增加出错的可能性,因为您可能倾向于假设它会通过将用户重定向到HTTPS来自动纠正自身,而这通常为时已晚。 (在this question.)中有类似的讨论
答案 4 :(得分:17)
我发现https和域名www的最佳方式是
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
答案 5 :(得分:8)
我喜欢这种从http重定向到https的方法。因为我不需要为每个网站编辑它。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
答案 6 :(得分:6)
使用.htaccess文件中的以下代码会自动将访问者重定向到您网站的HTTPS版本:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
如果您有现有的.htaccess文件:
不要重复使用RewriteEngine。
确保以RewriteCond和RewriteRule开头的行紧跟现有的RewriteEngine On。
答案 7 :(得分:5)
最佳解决方案取决于您的要求。这是先前发布的答案的摘要,其中添加了一些上下文。
如果您使用Apache Web服务器并可以更改其配置,请按照Apache documentation:
进行操作<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 array和header function:
if (!$_SERVER['HTTPS']) {
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
}
答案 8 :(得分:5)
根据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
答案 9 :(得分:4)
将以下代码添加到.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]
答案 10 :(得分:4)
执行上面解释的所有内容以进行重定向。只需添加&#34; HTTP严格传输安全&#34;到你的标题。这样可以避免中间人的攻击。</ p>
编辑您的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
答案 11 :(得分:2)
要将所有http
次请求重定向到https
,您可以使用:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]
如果未启用mod-rewrite并且您使用的是apache 2.4,则还可以使用Redirect
if
指令将http
请求重定向到https
}。
Apache 2.4。
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
答案 12 :(得分:2)
如果您处于无法直接访问您网站的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建议您尽可能不使用此方法。但是,它只需要对开发端进行额外检查,以确保用户的数据安全。希望这可以帮助其他人因为托管服务的限制而不得不考虑使用非推荐的方法。
答案 13 :(得分:1)
通过.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]
另外,请参阅此更多详细信息。 How To Redirect Http To Https?
答案 14 :(得分:1)
除非你需要mod_rewrite用于其他事情,否则使用Apache核心IF指令更清晰&amp;更快:
<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/(我正在处理的网站)。
答案 15 :(得分:0)
以上内容仅适用于 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();
}
答案 16 :(得分:0)
我尝试了所有可以在 Internet 上找到的 .htaccess
配置,但都没有奏效。
然后,我意识到 {{3}} 不鼓励使用 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
答案 17 :(得分:0)
我找到了一种方法,可以强制将我的网站的所有页面从http重定向到对我有用的https上的页面的类似物。
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
答案 18 :(得分:0)
您不仅可以在.htaccess文件中执行此操作,还应该在此期间执行此操作。在实现此重定向之后,您还需要按照here的步骤将您的网站列出在HSTS预加载列表中,以使对不安全的http版本的网站的任何请求都不会使其超出用户代理。而是,用户代理对照仅HTTPS网站的列表中的列表检查请求的URI,如果请求的URI在该列表中,则在将请求传输到服务器之前将协议从http更改为https。因此,不安全的请求永远不会使其泛滥,也不会命中服务器。最终,当Internet切换到https时,仅不需要HSTS预加载列表。在此之前,每个站点都应该使用它。
为了执行重定向,我们需要启用重写引擎,然后将所有流量从http端口80重定向到https。
CREATE TRIGGER ChangeLastModified
ON lab5.SaleOrderDetail
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE Lab5.SaleOrder
SET LastModified = CURRENT_TIMESTAMP
FROM lab5.SaleOrder
INNER JOIN inserted i ON SaleOrder.OrderID = i.OrderID
END
答案 19 :(得分:0)
Redirect 301 / https://example.com/
(当以上答案均无效时为我工作)
奖金:
ServerAlias www.example.com example.com
(未找到固定的https:// www .example.com)
答案 20 :(得分:0)
如果要从tomcat服务器执行此操作,请执行以下步骤
在独立的Apache Tomcat(8.5.x)HTTP Server中,如何进行配置,以便如果用户键入www.domain.com,则将其自动转发到https(www.domain.com)站点。
两步方法,在[Tomcat_base] /conf/web.xml中,在结束标记之前添加以下内容
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。
答案 21 :(得分:0)
将此代码带给您.htaccess文件 Redirect HTTP to HTTPS automatically
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
答案 22 :(得分:-1)
如果您使用的是接受HTTPS流量并将其通过http路由到服务器的Amazon Web Services Elastic Load Balancer,则在此处介绍将所有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>
或在您的.htaccess根文件中:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
奖金:它将不会尝试重定向本地开发计算机上的http通信。
答案 23 :(得分:-1)
这会将所有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]
答案 24 :(得分:-1)
它对我有用:
<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
答案 25 :(得分:-1)
如果您使用的是Apache,mod_rewrite是最简单的解决方案,并且在线有很多文档如何做到这一点。例如:http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
答案 26 :(得分:-1)
此问题的另一个优势是负载均衡器发挥作用。
情况如下: - 从浏览器到Load Balancer的流量,然后回来,应该是(应该是)HTTPS - Load Balancer和实际WebServer之间的流量是HTTP。
因此,PHP或Apache中的所有服务器请求变量都表明连接只是HTTP。并且服务器上的HTTP和HTTPS目录是相同的。
批准的答案中的RewriteCondition不起作用。 它给出一个循环或它只是不起作用。
问题是:如何使用Load Balancer。
(或者Load Balancer配置错误。我希望这是因为我可以将问题转移到WebHosting公司:-))