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

时间:2014-12-28 01:32:36

标签: apache .htaccess mod-rewrite redirect ssl

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

在冒险进入mod_rewrite和大量阅读(主要来自stackoverflow)后,我有一个.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>

该脚本包含有关它的功能的评论(我需要的比你想象的要多)。 并且在重定向的子域的文件夹上有一个额外的.htaccess文件(根网站文件夹中的子文件夹,具有匹配的子域名)以及我的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 个答案:

答案 0 :(得分:9)

  

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

不,您无能为力,您的评估是正确的,浏览器查看服务器证书并发现主机不匹配并显示错误。该错误不是由服务器生成的,而是在请求发送到服务器之前发生。这种情况发生在SSL握手期间。您可以做的唯一事情是阻止现有的任何http://www链接,或者购买包含&#34; www&#34;的新证书。

至于你的规则,由于每个规则都有多个条件,因此无法简化它。