htaccess http到https redirect for www&子域名

时间:2015-10-04 09:45:14

标签: php apache .htaccess redirect https

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

# 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网页
没有人弄乱对方。

1 个答案:

答案 0 :(得分:3)

好的,你的mod_rewrite的问题是重写规则:

RewriteCond %{HTTP_HOST} !^www\. [NC]

将匹配任何不以www。

开头的内容

这一行的语法是:

RewriteCond {string to match} {regular expression to match} {other parameters}

在你的情况下,它说:

匹配主机名(%{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。"开头的网址,包括" 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开头。并不是从我开始的,然后是前面的。

这是一个很好的测试人员,您可以使用它来玩不同的解决方案:http://htaccess.madewithlove.be/

要学习如何编写这些文件,首先要学习正则表达式;他们是任何技术专家工具包的重要组成部分!

祝你好运:)