所以我的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>
答案 0 :(得分:9)
在浏览器发出证书错误之前,有没有办法阻止流量以不正确的方式(https:// www)命中服务器?
不,您无能为力,您的评估是正确的,浏览器查看服务器证书并发现主机不匹配并显示错误。该错误不是由服务器生成的,而是在请求发送到服务器之前发生。这种情况发生在SSL握手期间。您可以做的唯一事情是阻止现有的任何http://www
链接,或者购买包含&#34; www&#34;的新证书。
至于你的规则,由于每个规则都有多个条件,因此无法简化它。