如何使用 .htaccess 规则将所有 HTTP 请求重定向到 HTTPS?
我正在尝试将我的网站(例如 http://www.example.com
)上的所有不安全 HTTP 请求重定向到 HTTPS (<代码>https://www.example.com)。如何在 .htaccess 文件中执行此操作?
顺便说一句,我正在使用 PHP。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(29)
我建议使用 301 重定向:
I'd recommend with 301 redirect:
正如我在 这个问题,我建议您避免盲目地将所有 HTTP 请求重定向到其 HTTPS 等效项,因为这可能会给您带来安全性的错误印象。相反,您可能应该将 HTTP 站点的“根”重定向到 HTTPS 站点的根,并从那里仅链接到 HTTPS。
问题是,如果 HTTPS 站点上的某些链接或表单使客户端向 HTTP 站点发送请求,则在重定向之前其内容将是可见的。
例如,如果通过 HTTPS 提供的某个页面的表单显示
当然,一旦您在与您的 HTTPS 站点相同的 IP 地址上的 HTTP 端口上侦听某些内容,提供应该指向 HTTPS 站点但最终指向 HTTP 站点的链接的错误可能会导致问题。但是,我认为将这两个站点保留为“镜像”只会增加犯错误的机会,因为您可能倾向于假设它会通过将用户重定向到 HTTPS 来自动更正,但通常为时已晚。 (
As I was saying in this question, I'd suggest you avoid redirecting all HTTP requests to their HTTPS equivalent blindly, as it may cause you a false impression of security. Instead, you should probably redirect the "root" of your HTTP site to the root of your HTTPS site and link from there, only to HTTPS.
The problem is that if some link or form on the HTTPS site makes the client send a request to the HTTP site, its content will be visible, before the redirection.
For example, if one of your pages served over HTTPS has a form that says
<form action="http://example.com/doSomething">
and sends some data that shouldn't be sent in clear, the browser will first send the full request (including entity, if it's a POST) to the HTTP site first. The redirection will be sent immediately to the browser and, since a large number of users disable or ignore the warnings, it's likely to be ignored.Of course, the mistake of providing the links that should be to the HTTPS site but that end up being for the HTTP site may cause problems as soon as you get something listening on the HTTP port on the same IP address as your HTTPS site. However, I think keeping the two sites as a "mirror" only increases the chances of making mistakes, as you may tend to make the assumption that it will auto-correct itself by redirecting the user to HTTPS, whereas it's often too late. (There were similar discussions in this question.)
HTML 重定向方法。
它有效,但不是最好的。
PHP 方法
.htaccess
方法复制自:
www.letuslook.org
HTML redirect approach.
It works, but it's not the best.
PHP approach
.htaccess
approachcopied from:
www.letuslook.org
我发现域上 https 和 www 的最佳方式是
I found out that the best way for https and www on domain is
最佳解决方案取决于您的要求。这是之前发布的答案的摘要,并添加了一些上下文。
如果您使用 Apache Web 服务器并且可以更改其配置,请遵循 Apache文档:
但您还询问是否可以在
.htaccess
文件中执行此操作。在这种情况下,您可以使用 Apache 的 RewriteEngine:如果一切正常并且如果您希望浏览器记住此重定向,则可以通过将最后一行更改为:来将其声明为永久重定向,
但如果您可能对此重定向改变主意,请小心。浏览器会记住它很长一段时间并且不会检查它是否发生变化。
您可能不需要第一行
RewriteEngine On
,具体取决于网络服务器配置。如果您正在寻找 PHP 解决方案,请查看 $_SERVER 数组 并标头函数:
The best solution depends on your requirements. This is a summary of previously posted answers with some context added.
If you work with the Apache web server and can change its configuration, follow the Apache documentation:
But you also asked if you can do it in a
.htaccess
file. In that case you can use Apache's RewriteEngine:If everything is working fine and you want browsers to remember this redirect, you can declare it as permanent by changing the last line to:
But be careful if you may change your mind on this redirect. Browsers remember it for a very long time and won't check if it changed.
You may not need the first line
RewriteEngine On
depending on the webserver configuration.If you look for a PHP solution, look at the $_SERVER array and the header function:
我喜欢这种从 http 重定向到 https 的方法。因为我不需要为每个站点进行编辑。
I like this method of redirecting from http to https. Because I don't need to edit it for each site.
在 .htaccess 文件中使用以下代码会自动将访问者重定向到站点的 HTTPS 版本:
如果您有现有的 .htaccess 文件:
请勿重复 RewriteEngine On。
确保以 RewriteCond 和 RewriteRule 开头的行紧跟在已存在的 RewriteEngine On 后面。
Using the following code in your .htaccess file automatically redirects visitors to the HTTPS version of your site:
If you have an existing .htaccess file:
Do not duplicate RewriteEngine On.
Make sure the lines beginning RewriteCond and RewriteRule immediately follow the already-existing RewriteEngine On.
如果您无法直接访问站点的 apache 配置,而许多托管平台仍然受到这种方式的限制,那么我实际上会建议采用两步方法。 Apache 自己记录的原因是,对于 HTTP 到 HTTPS,您应该首先使用其配置选项而不是 mod_rewrite。
首先,如上所述,您将设置您的 .htaccess mod_rewrite 规则:
然后,在您的 PHP 文件中(您需要在适合您情况的地方执行此操作,某些网站将通过以下方式汇集所有请求)一个 PHP 文件,其他文件根据需要和发出的请求提供不同的页面):
上述内容需要在任何可能在不安全的环境中暴露安全数据的代码之前运行。因此,您的站点通过 HTACCESS 和 mod_rewrite 使用自动重定向,而您的脚本确保在不通过 HTTPS 访问时不提供输出。
我想大多数人不这么认为,因此 Apache 建议您尽可能不要使用这种方法。但是,只需在开发端进行额外检查即可确保用户数据的安全。希望这对由于我们的托管服务端的限制而可能不得不考虑使用非推荐方法的其他人有所帮助。
If you are in a situation where your cannot access the apache config directly for your site, which many hosted platforms are still restricted in this fashion, then I would actually recommend a two-step approach. The reason why Apache themselves document that you should use their configuration options first and foremost over the mod_rewrite for HTTP to HTTPS.
First, as mentioned above, you would setup your .htaccess mod_rewrite rule(s):
Then, in your PHP file(s) (you need to do this where ever it would be appropriate for your situation, some sites will funnel all requests through a single PHP file, others serve various pages depending on their needs and the request being made):
The above needs to run BEFORE any code that could potentially expose secure data in an unsecured environment. Thus your site uses automatic redirection via HTACCESS and mod_rewrite, while your script(s) ensure no output is provided when not accessed through HTTPS.
I guess most people don't think like this, and thus Apache recommends that you don't use this method where possible. However, it just takes an extra check on the development end to ensure your user's data is secure. Hopefully this helps someone else who might have to look into using non-recommended methods due to restrictions on our hosting services end.
执行上面解释的所有重定向操作。只需将“HTTP 严格传输安全”添加到您的标头即可。这将避免中间人攻击。
https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
Do everything that is explained above for redirection. Just add "HTTP Strict Transport Security" to your header. This will avoid man in the middle attack.
https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
根据 GoDaddy.com,这是使用 .htaccess 将 HTTP 重定向到 HTTPS 的正确方法。第一行代码是不言自明的。第二行代码检查 HTTPS 是否关闭,如果是,则通过运行第三行代码将 HTTP 重定向到 HTTPS,否则忽略第三行代码。
https://www.godaddy.com/help/redirect- http-to-https-automatically-8828
This is the proper method of redirecting HTTP to HTTPS using .htaccess according to GoDaddy.com. The first line of code is self-explanatory. The second line of code checks to see if HTTPS is off, and if so it redirects HTTP to HTTPS by running the third line of code, otherwise the third line of code is ignored.
https://www.godaddy.com/help/redirect-http-to-https-automatically-8828
将以下代码添加到 .htaccess 文件中:
其中 [您的域名] 是您网站的域名。
您还可以通过将上面代码的最后一行替换为以下内容,将特定文件夹重定向到您的域名:
Add the following code to the .htaccess file:
Where [your domain name] is your website's domain name.
You can also redirect specific folders off of your domain name by replacing the last line of the code above with:
要将所有
http
请求重定向到https
,您可以使用:如果未启用 mod-rewrite 并且您使用的是 apache 2.4,您还可以使用
Redirect
内的if
指令将http
请求重定向到https
。阿帕奇2.4。
To redirect all
http
requests tohttps
, you can use :If mod-rewrite isn't enabled and you are on apache 2.4, you can also use a
Redirect
insideif
directive to redirecthttp
requests tohttps
.Apache 2.4.
除非您需要 mod_rewrite 来做其他事情,否则使用 Apache core IF 指令会更干净。更快:
您可以向 IF 指令添加更多条件,例如确保没有 www 前缀的单个规范域:
对所有内容使用 mod_rewrite 都有很多熟悉惯性,但看看这是否适合您。
更多信息: https://httpd.apache.org/docs/2.4 /mod/core.html#if
要查看其实际效果(尝试不使用 www. 或 https://,或者使用 .net 而不是 .com): https://nohodental.com/(我正在开发的网站)。
Unless you need mod_rewrite for other things, using Apache core IF directive is cleaner & faster:
You can add more conditions to the IF directive, such as ensure a single canonical domain without the www prefix:
There's a lot of familiarity inertia in using mod_rewrite for everything, but see if this works for you.
More info: https://httpd.apache.org/docs/2.4/mod/core.html#if
To see it in action (try without www. or https://, or with .net instead of .com): https://nohodental.com/ (a site I'm working on).
(当上述答案都不起作用时,对我有用)
奖金:(
修复了 https://www.example.com 未找到)
(worked for me when none of the above answers worked)
Bonus:
(fixed https://www.example.com not found)
我尝试了在互联网上可以找到的所有
.htaccess
配置,但没有一个起作用。然后,我意识到 Apache 不鼓励使用
mod_rewrite< /代码>。
我的解决方案是编辑以下文件夹下的 apache 配置文件:
/etc/apache2/sites-enabled
您将拥有一个名为
000-default.conf
的强制文件和一个名为000-default-le-ssl 的 ssl 配置文件.conf
(如果您已安装来自 LetsEncrypt/certBot 的 ssl 证书)。但是,这些文件的名称可能有所不同,具体取决于您在设置站点时提供的文件名。在
000-default.conf
中,我在
中将以下内容编辑为:在
000-default-le-ssl.conf
中code>,我在
中编辑了以下内容:不需要其他重定向。
保存文件,然后使用 sudo service apache2 restart 重新启动 apache 服务器
I tried all
.htaccess
configurations I could find on the internet but none worked.Then, I realized Apache discourages using
mod_rewrite
.My solution was to edit apache configuration files under the following folder:
/etc/apache2/sites-enabled
You will have one mandatory file named
000-default.conf
and an ssl configuration file named000-default-le-ssl.conf
(if you have installed ssl certificate from letsencrypt/certbot). However, these files can be named differently depending on the file names you provided when setting up the site.In
000-default.conf
, I edited the following inside<VirtualHost *:80>
as:In
000-default-le-ssl.conf
, I edited the following inside<VirtualHost *:80>
as:No other redirection is needed.
Save the file then restart the apache server using
sudo service apache2 restart
以上内容仅适用于 Apache 服务器。如果在 tomcat 上运行 PHP 会怎样?
所以你可以使用PHP代码,无论是Apache/tomcat/Nginx等...
The above things are for the Apache server only. What if running PHP at tomcat?
So you can use PHP code, whether it is Apache/tomcat/Nginx etc...
实际上,我试图让它在没有负载均衡器的 EC2 实例上运行,因为这需要花钱。我到处都读到 .htaccess 不是“正确”的方法。显然,它会起作用,但我试图按章办事。我按照所有示例来更新 httpd.conf 文件并添加了很多不必要的内容。事实证明,您真正需要的唯一一行是:
我的问题是,最初我已将其添加到 httpd.conf 内的 VirtualHost 标记中,这是很多帖子告诉您要做的事情,但它不起作用。事实证明,/etc/httpd/conf.d 中存储了一个名为 yourdomain.conf 的单独的 conf 文件,该文件已经具有 VirtualHost 标记,并且覆盖了我的 httpd.conf 设置。我刚刚在其中添加了上面的行,瞧,它立即重定向到 https。端口 443 不需要单独的 VirtualHost。
它现在正在工作,VirtualHost 标记如下所示:
注意:我已经使用来自 certbot 的免费证书进行了 TLS 设置(喜欢那些家伙),并且只是尝试重定向常规 http 调用到工作 https 站点。
I was actually trying to get this to work on an EC2 instance without a load balancer since that costs money. I've read everywhere that .htaccess isn't the "right" way to do it. Obviously, it will work, but I was trying to keep things by the book. I was following all of the examples to update the httpd.conf file and adding a lot of unnecessary stuff. It turns out the only line you really need is this:
My problem was that originally I had added this in a VirtualHost tag inside of httpd.conf, which is what a lot of posts tell you to do, but it wasn't working. It turns out there was a separate conf file stored in /etc/httpd/conf.d called yourdomain.conf which already had the VirtualHost tag and was overriding my httpd.conf settings. I just added the above line inside of it and voila, it instantly redirected to https. There is no need for the separate VirtualHost for port 443.
It's working now and the VirtualHost tag looks like this:
Note: I already had TLS setup with a FREE certificate from certbot (Love those guys) and was just trying to redirect regular http calls to the working https site.
在 http 到 https 重定向的情况下,如果您无权访问主服务器配置文件,并且有义务在 . htaccess 文件代替。
In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
将此代码复制到您的 .htaccess 文件中
自动将 HTTP 重定向到 HTTPS
RewriteEngine 开启
RewriteCond %{HTTPS} 已关闭
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
take this code to you .htaccess file
Redirect HTTP to HTTPS automatically
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
您不仅可以在 .htaccess 文件中执行此操作,而且您应该在这段时间内执行此操作。您还需要按照此处的步骤操作,在实施此重定向后将您的网站列入 HSTS 预加载列表,以便对您网站的不安全 http 版本的任何请求都不会通过用户代理。相反,用户代理会根据内置的仅 https 网站列表检查请求的 URI,如果请求的 URI 位于该列表中,则在将请求传输到服务器之前将协议从 http 更改为 https。因此,不安全的请求永远不会传播出去,也永远不会到达服务器。最终,当互联网切换为 https 时,将不再需要 HSTS 预加载列表。在那之前,每个网站都应该使用它。
为了执行重定向,我们需要启用重写引擎,然后将所有流量从 http 端口 80 重定向到 https。
Not only can you do this in your .htaccess file, you should be doing this period. You will also want to follow the steps here to get your site listed on the HSTS preload list after you implement this redirect so that any requests to the insecure http version of your website never make it past the user agent. Instead, the user agent checks the requested URI against a baked in list of https only websites and, if the requested URI is on that list, changes the protocol from http to https before transmitting the request to the server. Therefore, the insecure request never makes it out into the wild and never hits the server. Eventually when the internet changes over to https only the HSTS preload list will not be needed. Until then, every site should be using it.
In order to perform the redirect, we need to enable the rewrite engine and then redirect all traffic from the http port 80 to https.
经过多次尝试,考虑没有 www 和有 www 这有效
After lots of tries by considering without www and with www this works this
如果您想从 tomcat 服务器执行此操作,请按照以下步骤
在独立的 Apache Tomcat (8.5.x) HTTP 服务器中,如何配置它,以便用户键入 www.domain.com,它们将自动转发到 https(www. domain.com)网站。
两步方法是在 WEB-INF/web.xml 结束标记之前包含以下内容
并设置 [Tomcat_base]/conf/server.xml 连接器设置:
注意:如果您已经完成了 https 配置并尝试重定向,请执行以下操作:仅第 1 步。
If you want to do it from the tomcat server follow the below steps
In a standalone Apache Tomcat (8.5.x) HTTP Server, how can configure it so if a user types www.domain.com, they will be automatically forwarded to https(www.domain.com) site.
The 2 step method of including the following in your WEB-INF/web.xml before the closing tag
and setting the [Tomcat_base]/conf/server.xml connector settings:
Note: If you already did the https configuration and trying to redirect do step 1 only.
通过 .htaccess 这会有所帮助。
另外,请参阅此了解更多详细信息。 如何将 Http 重定向到 Https?
Through .htaccess This will help.
Also, Refer this for More Detail. How To Redirect Http To Https?
这会将所有 URL 重定向到 https 和 www
This redirects all the URLs to https and www
如果您使用 Apache,mod_rewrite 是最简单的解决方案,并且在线有大量文档说明如何做到这一点。例如: http://www.askapache.com/htaccess/http- https-rewriterule-redirect.html
If you are using Apache, mod_rewrite is the easiest solution, and has a lot of documentation online how to do that. For example: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
如果您使用的 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 文件中:
或者在您的根 .htaccess 文件中:
额外好处:它不会尝试在本地开发计算机上重定向 http 流量。
If you're using an Amazon Web Services Elastic Load Balancer which accepts https traffic and routes it to your server(s) with http, the correct way to redirect all http traffic to https is described here: https://aws.amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb
Use the X-Forwarded-Proto header (contains http or https) which is always included in http requests from the load balancer, as described here: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html
In the httpd.conf file:
Or in your root .htaccess file:
Bonus: it will not try to redirect http traffic on your local development machine.
它对我有用:
例如 http:// /server/foo?email=someone%40example.com 正常重定向,没有任何问题。
文件 .htaccess 位于网站根文件夹(例如名为 public_html)。
可以使用
RewriteCond %{SERVER_PORT} !^443$ 改为 RewriteCond %{HTTPS} !on
It works for me:
and for example, http://server/foo?email=someone%40example.com redirects normally without any issues.
The file .htaccess located in the website root folder (for example named public_html).
It is possible to use
RewriteCond %{SERVER_PORT} !^443$ instead RewriteCond %{HTTPS} !on
Apache 文档 建议不要使用重写:
此代码段应进入主服务器配置文件,而不是进入
.htaccess< /code> 如问题中所问。
这篇文章可能是在问题被提出并回答之后才出现的,但似乎是当前的发展方向。
The Apache docs recommend against using a rewrite:
This snippet should go into main server configuration file, not into
.htaccess
as asked in the question.This article might have come up only after the question was asked and answered, but seems to be the current way to go.
在您的
.htaccess
文件中添加以下内容Add the following inside your
.htaccess
file