【发布时间】:2015-02-24 16:52:54
【问题描述】:
所以我的 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>
脚本包含有关其作用的 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>
【问题讨论】:
标签: apache .htaccess mod-rewrite redirect ssl