1

我们在一些网站上使用 cPanel,我们使用以下 .htaccess 规则,并且在大多数情况下它们可以正常工作,但它们有一些问题......

# Force HTTPS & NON-WWW
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} ^www\. [NC]
    RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
</IfModule>

根据以下规则,如果我们访问非 www 链接,它们会正确切换到 www。好的链接

# Force HTTPS & WWW
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
    RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
</IfModule>

这条Force HTTPS & WWW规则的问题是当我们谈到子域时......

  1. 如果我们访问staging.website.com不正确,它会被重写为www.staging.website.com. 当然可以使用类似的条件RewriteCond %{HTTP_HOST} !^staging\. [NC],但这意味着每个子域都需要一个设置。
  2. 添加该条件的另一个问题是,如果我们访问 staging.website.com,它不会被迫使用 https...
  3. 在更复杂的设置中,我们有一个 cPanel 帐户,其中有 3 个网站https://,一个是https://www.,对于那个特定的 cPanel 帐户,我不知道如何修改这些 .htaccess 规则以适用于这两种情况......

#1和#2在涉及到时最引人注目ipv6.website.com

强制`httPs & WWW的规则测试

  • https://website.com-->https://www.website.com

  • http://website.com-->https://www.website.com

  • https://www.website.com-->https://www.website.com

  • http://www.website.com-->https://www.website.com

  • https://ipv6.website.com-->https://ipv6.website.com

  • http://ipv6.website.com-->https://ipv6.website.com

  • https://www.ipv6.website.com-->https://ipv6.website.com

  • http://www.ipv6.website.com-->https://ipv6.website.com

  • https://randomsubdomain.website.com-->https://www.randomsubdomain.website.com

  • http://randomsubdomain.website.com-->https://www.randomsubdomain.website.com

  • https://www.randomsubdomain.website.com-->https://www.randomsubdomain.website.com

  • http://www.randomsubdomain.website.com-->https://www.randomsubdomain.website.com

  • https://ftp.website.com-->http://ftp.website.com

  • http://ftp.website.com-->http://ftp.website.com

  • https://www.ftp.website.com-->http://ftp.website.com

  • http://www.ftp.website.com-->http://ftp.website.com

强制`httPs & Non-WWW 的规则测试

  • https://website.com-->https://website.com

  • http://website.com-->https://website.com

  • https://www.website.com-->https://website.com

  • http://www.website.com-->https://website.com

  • https://ipv6.website.com-->https://ipv6.website.com

  • http://ipv6.website.com-->https://ipv6.website.com

  • https://www.ipv6.website.com-->https://ipv6.website.com

  • http://www.ipv6.website.com-->https://ipv6.website.com

  • https://randomsubdomain.website.com-->https://randomsubdomain.website.com

  • http://randomsubdomain.website.com-->https://randomsubdomain.website.com

  • https://randomsubdomain.website.com-->https://www.randomsubdomain.website.com

  • http://randomsubdomain.website.com-->https://www.randomsubdomain.website.com

  • https://ftp.website.com-->http://ftp.website.com

  • http://ftp.website.com-->http://ftp.website.com

  • https://www.ftp.website.com-->http://ftp.website.com

  • http://www.ftp.website.com-->http://ftp.website.com

4

1 回答 1

1

看来您需要在这里有 2 个单独的重定向规则:

  1. 为根域添加wwwhttps://
  2. https://仅用于添加子域

你可以让你的 .htaccess 像这样:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # enforce http:// and non-www for ftp domain:
    RewriteCond %{HTTPS} on [OR]
    RewriteCond %{HTTP_HOST} ^www\. [NC]
    RewriteCond %{HTTP_HOST} ^(?:www\.)?(ftp\..+)$ [NC]
    RewriteRule ^ http://%1%{REQUEST_URI} [L,NE,R=301]

    RewriteCond %{HTTP_HOST} ^ftp\. [NC]
    RewriteRule ^ - [L]

    # Force HTTPS & WWW for any subdomain not in list
    RewriteCond %{HTTPS} !on [OR]
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteCond %{HTTP_HOST} !(?:^|\.)(?:ipv6|mail|mobile|staging|cpanel)\. [NC]
    RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
    RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

    # Force HTTPS & non-WWW for listed sub domains
    RewriteCond %{HTTPS} !on [OR]
    RewriteCond %{HTTP_HOST} ^www\. [NC]
    RewriteCond %{HTTP_HOST} ^(?:www\.)?((?:ipv6|maill|mobile|staging|cpanel)\..+)$ [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
    
</IfModule>

于 2020-10-02T06:35:24.583 回答