htaccess强制https并将www重定向到非www,但没有其他子域

时间:2014-01-30 21:02:35

标签: apache .htaccess mod-rewrite https

我知道有许多类似的线程,但它们似乎都不符合我的确切问题。这是我正在尝试做的事情:

(1) http://www.mydomain.com/ -> https://mydomain.com/
(2) http://mydomain.com/     -> https://mydomain.com/
(3) https://www.mydomain.com -> https://mydomain.com/

理想情况下,如果我要添加更多子域,我还想覆盖这种情况,以便自动执行以下操作(最好采用适用于我添加的任何子域的通用方式)。

(4) http://sub.mydomain.com/ -> https://sub.mydomain.com/

此时我想知道是否甚至可以创建一个单独的.htaccess文件来完成我需要的一切,虽然我不得不承认我理解正则表达式,但我不是一个mod_rewrite uberpro。

以下是我已经尝试过的解决方案:

我的SSL证书涵盖www-subdomain,所以我不是在寻找'不可信连接'错误解决方案,我知道这是不可能的。

7 个答案:

答案 0 :(得分:23)

我发现当你有https://www.example.com的内容并重定向到https://example.com时,大多数建议都没有被捕获。

以下内容适用于所有排列:

RewriteEngine On

# match any URL with www and rewrite it to https without the www
RewriteCond %{HTTP_HOST} ^(www\.)(.*) [NC]
RewriteRule (.*) https://%2%{REQUEST_URI} [L,R=301]

# match urls that are non https (without the www)
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^(www\.)(.*) [NC]
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

希望这有助于某人!

答案 1 :(得分:11)

将此代码放入DOCUMENT_ROOT/.htaccess文件中:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{ENV:HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301,NE]

答案 2 :(得分:2)

<slot>

此脚本将重定向

同时保留子域名。

答案 3 :(得分:1)

强制使用HTTPS

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

强制www到非www

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.bewebdeveloper.com$
RewriteRule ^(.*) http://bewebdeveloper.com/$1  [QSA,L,R=301]

答案 4 :(得分:0)

不是这些例子对我有用,他们似乎只是陷入了一个循环中,但以下情况有效。

    # match any URL with www and rewrite it to https without the www
    RewriteCond %{HTTP_HOST} ^(www\.)(.*) [NC]
    RewriteRule (.*) https://%2%{REQUEST_URI} [R=301,L]

    # match non https and redirect to https
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

顺序很重要,在某些情况下会阻止第3次重定向。

如果您想使用子域名(除了www。以外的任何内容),只需删除第一个规则集。

因此,对于子域,您只需要

    # match non https and redirect to https
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

我使用Cloudways服务,我发现这是唯一有效的方法

答案 5 :(得分:0)

我发现以下答案符合您的要求:

  

www to non-www with https没有其他子域名

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

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

满足所有三(3)个条件:

(1) http://www.example.com/ -> https://example.com/
(2) http://example.com/     -> https://example.com/
(3) https://www.example.com -> https://example.com/

没有其他子域名,而不是www,如此:

(4) http://others.example.com -> https://others.example.com/
(5) https://others.example.com -> https://others.example.com/

答案 6 :(得分:0)

只需将此代码添加到根 .htaccess 文件中

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