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

avl*_*uis 6 apache .htaccess mod-rewrite ssl redirect

所以我的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>
Run Code Online (Sandbox Code Playgroud)

该脚本包含有关它的功能的评论(我需要的比你想象的更多).并且在重定向的子域的文件夹上有一个额外的.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>
Run Code Online (Sandbox Code Playgroud)

Jon*_*Lin 9

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

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

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