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