将 https://www 重定向到 https://non-www - 没有看到证书错误,可能吗?

Posted

技术标签:

【中文标题】将 https://www 重定向到 https://non-www - 没有看到证书错误,可能吗?【英文标题】:Redirecting https://www to https://non-www - without seeing certificate error, possible? 【发布时间】:2015-02-24 16:52:54 【问题描述】:

所以我的 SSL 证书仅适用于 https://example.com - 不适用于 https://www.example.com(不能抱怨,它是免费)。

在冒险进入 mod_rewrite 并进行大量阅读(主要来自 ***)之后,我有一个 .htaccess 文件,它可以满足我的大部分需求,这是该文件(当然,域已编辑)。

<IfModule mod_rewrite.c>
    RewriteEngine On

    #First rewrite any request to the wrong domain to use the correct one
    RewriteCond %HTTP_HOST !^subdomain\.
    RewriteCond %HTTP_HOST ^(www|ftp|mail)\.example\.com [NC]
    RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

    #Redirect these subdomains to a subfolder
    RewriteCond %HTTP_HOST ^([^/.]+)\.example\.com$ 
    RewriteCond %1 !^(www|ftp|mail)$ [NC]
    RewriteRule (.+)$ "http://example.com/%1" [L,P]

    #Now, rewrite to HTTPS:
    RewriteCond %HTTPS off
    RewriteCond %HTTP:X-Forwarded-Proto !https
    RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]
</IfModule>

脚本包含有关其作用的 cmets(我比您想象的更需要它们)。 并且在被重定向的子域的文件夹上还有一个额外的 .htaccess 文件(根 Web 文件夹中的一个子文件夹,具有匹配的子域名)和我的 dns 服务器上的随附 dns 条目。该文件夹上的 .htaccess 只是将 http(端口 80)重定向到 https。

目前,它可以满足我的需求,但我正在寻找更简单的方法来编写它。更简单也可能意味着更全球化(如果它比硬编码域更快),并且如果从所述重写中获得任何速度改进。

如前所述,我的证书仅适用于非 www example.com 域,因此这使我想到了第二个(但我的主要)问题。

这样路由的流量:https://www.example.com 将在任何路由、重写等完成之前看到错误。这是因为此时甚至还没有连接到 Web 服务器,对吗?这本质上是您的服务器移交您的证书,浏览器说: 等一下!

在浏览器发出证书错误之前,有没有办法防止流量以不正确的方式 (https://www) 访问您的服务器?

这不必仅限于 .htaccess 方法。

有没有办法做到这一点 - 根本?那是什么?

编辑:

我的条件有一些问题,并且重写了不应该的查询。我也有一些重定向循环,所以前往 apache.org 进行研究;因此,作为跟踪上述更改的一种方式,现在使用 .htaccess 文件:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # First rewrite any request to the wrong domain to use the correct one
    RewriteCond %HTTP_HOST ^(www|ftp|mail)\.example\.com$ [NC]
    RewriteRule ^(.*)$ http://example.com/$1

    # Redirect these subdomains to a subfolder
    RewriteCond %HTTP_HOST ^([^/.]+)\.example\.com$
    RewriteCond %REQUEST_URI !^([^/.]+)/([^/.]+)
    RewriteCond %1 !^(www|ftp|mail)$ [NC]
    RewriteRule ^(.*)$ http://example.com/%1$1 [L,NC,QSA]

    #Now, rewrite to HTTPS:
    RewriteCond %HTTPS off
    RewriteCond %HTTP_HOST !^$
    RewriteCond %HTTP_HOST ^http://example\.com/$ [NC]
    RewriteRule ^/?(.*) https://%HTTP_HOST/$1 [L,R,NE]
</IfModule>

【问题讨论】:

【参考方案1】:

有没有办法在浏览器发出证书错误之前防止流量以不正确的方式 (https://www) 访问您的服务器?

不,您无能为力,您的评估是正确的,浏览器查看服务器证书并发现主机不匹配并显示错误。该错误不是由服务器生成的,这发生在甚至将请求发送到服务器之前。这发生在 SSL 握手期间。您唯一能做的就是阻止任何http://www 链接存在,或者购买包含“www”的新证书。

至于您的规则,实际上没有办法简化它,因为每个规则都有多个条件。

【讨论】:

谢谢!这证实了我的怀疑。我相信我也可以申请包含两个域(www 和非 www)的证书(不确定名称)。 @avluis 大多数发行人在域前包含“www”作为选项,然后您可以为额外的子域或通配符证书(所有子域)支付更多费用 @JonLin 也许是一个解决方案?问题是www 正在提供证书,这使得握手发生在 htacces 重定向之前。假设我们有办法在网站的 www 版本上禁用 SSL?这样就没有握手并且直接执行了 @snh_nl 如果有人转到https://www.,则无法禁用 SSL,除非您想运行非 SSL 版本,没有端口 443,这可能会在浏览器上导致不同的错误。另一个问题是端口 443 不能提供 SSL,主站点(没有 www)不能托管在该套接字上。

以上是关于将 https://www 重定向到 https://non-www - 没有看到证书错误,可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 https://www 重定向到 https://non-www

NGINX 将 http 重定向到 https,将非 www 重定向到 ww

将 https 重定向到非 www 和 http 到 www

将 https 非 www 重定向到 https www 不工作的虚拟主机

301 将 HTTP 重定向到 HTTPS - 非 www 到 www

使用 .htaccess 将 www URL 重定向到 https 的非 www