htaccess http转https重定向,包括www和子域名

3

我目前有一个重定向,可以将所有HTTP页面重定向到相应的HTTPS页面,包括http://www.http://页面,具体如下:

# redirect all pages to https://www
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
# redirect http to https
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

我还需要为子域名 http://my. 设置重定向,使其指向 https://my.

如果我在 .htaccess 文件中设置了子域名的重定向,则可能会被针对 www 的 .htaccess 文件干扰。

为了使以下流程顺利运行,我需要做出哪些更改:

  • 将所有 http://www.http:// 页面重定向到相应的 https 页面
  • 将所有 http://my. 页面重定向到相应的 https 页面

而不会互相影响。


我认为有人可能因为我在问题中使用了http//而不是http://而将我投票否决了。我想让他们知道,这是因为作为一个没有10分或更高评级的用户,我不能在问题中发布超过2个链接。谢谢你纠正了它。 - ostii
1个回答

4
好的,你的mod_rewrite问题在于重写规则:
RewriteCond %{HTTP_HOST} !^www\. [NC]
将匹配任何不以www开头的内容。
这行代码的语法是:
RewriteCond {要匹配的字符串} {要匹配的正则表达式} {其他参数}
在你的情况下,它表示:
匹配任何主机名(%{HTTP_HOST}),它不以“www。”(^)开头。 (句点前面的反斜杠是因为句点在正则表达式中有特殊含义 - 它代表“任何字符”)。
末尾的[NC]表示忽略大小写。
所以,你的.htaccess文件的第一部分是:
# redirect all pages to https://www
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

说:

重写每个不以“www.”开头的主机的URL,包括“me.”,在前面加上“www.”。

显然,这将把 me.whatever.com 重写为 www.me.whatever.com。

要修复它,您需要添加另一个匹配规则来排除该情况。

即: RewriteCond %{HTTP_HOST} !^me\. [NC]

因此完整的 .htaccess 应该是:

# redirect all pages to https://www
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} !^me\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
# redirect http to https
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

所以现在的重写条件是:如果主机名不以www开头且不以me.开头,则在前面加上www。

这里有一个不错的测试工具,您可以使用它来尝试不同的解决方案:http://htaccess.madewithlove.be/

学习如何编写这些文件之前,先学习正则表达式;它们是任何技术人员工具箱中必不可少的一部分!

祝好运 :)


1
那个htaccess链接看起来很棒。下次我遇到htaccess问题时,我会试一试的。 - Martin
不错!对于通用正则表达式的使用,https://regex101.com/ 是我最喜欢的。 - ptim
1
非常好。大部分都有效,但后来我发现了其他因素——在httpd.conf中有另一个重定向,我无法访问,导致了重定向循环。 - ostii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接