【问题标题】:how to force SSL _and_ remove www in one rule?如何在一条规则中强制 SSL _and_ 删除 www?
【发布时间】:2013-10-21 23:19:32
【问题描述】:

我有一个 ExpressionEngine 站点,我需要强制 SSL 删除 www。从网址。我正在使用此代码:

RewriteEngine On
RewriteBase /

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

# Remove index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteRule ^(.*)$ index.php/$1 [L]

但我刚刚意识到,如果有人访问https://www.URLHERE.com,他们不会删除 www。有没有办法在一个规则中同时强制 SSL 和删除 WWW(即我可以做一个“或”或其他什么?)还是我必须制定 2 个规则,一个删除 WWW,一个强制 SSL?

【问题讨论】:

    标签: .htaccess ssl no-www


    【解决方案1】:

    在您的规则中为这两个条件添加 OR 条件:

    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{HTTP_HOST} ^www\. [NC,OR]
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L,NE]
    
    // rest of your rules here...
    

    【讨论】:

    • 感谢您的回答,请问您还进行了哪些其他更改? NE 而不是 QSA,并且您的 WWW 检查在开头有一个 ?: 以及一个 + 而不是 *
    • QSA 仅在您修改查询字符串时使用(此处不适用)。 .+ 而不是 .* 因为域名肯定会在www. 之后有超过 1 个字符,如果不对结果 URL 进行编码,也是 NE。
    • 嗯,请问有没有办法在非 https 服务器上进行测试?我正在尝试查看它是否有效,但我目前无法访问 https(除了实时站点)。我尝试将第三行中的 https 更改为 http 但这会导致重定向循环:/
    • 您可以在本地安装 XAMPP 或 MAMP 包并进行测试。
    • 嗨,我试过了,它会导致重定向循环。我将在上面添加其余的 htaccess
    猜你喜欢
    • 2014-06-19
    • 2017-06-23
    • 2015-02-12
    • 2016-08-26
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2021-06-05
    • 2015-11-02
    相关资源
    最近更新 更多