最近万网做活动,虚拟主机免费两年,做个小站够了。正好阿里云服务器半年免费期快到了,就申请了一个将该站点部署其上。
通过实名认证才可申请,好在使用阿里云时已经通过认证,直接开通。域名需要备案,站点才可以正常访问。这也不是问题,该域名已经备案。
需要说一下的是,万网和阿里云的备案系统已经打通,在其中任意一方已经备过案,另外一方无需再次备案。
免费的东西总有不少限制,比如只能支持一个站点。于是准备通过Apache的mod_rewrite模块,将二级域名重写至二级目录。
本来以为挺简单的一件事,却折腾了挺久。一是对mod_rewrite语法不熟,使用生疏。二是苦于看不到日志,没办法调试。三是网络上的文章各种抄袭,真怀疑他们有没有自己检验过。
主要卡在循环重写上,不知为何即便加上了[L]参数,依然会多次重写,直至达到最大重写次数,抛出错误页。
最后通过对请求路径的过滤,才终于成功:
近期(2018-10)阿里云似乎对虚拟主机进行了调整,造成之前的配置失效,需要重新调整如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<IfModule mod_rewrite.c> # 打开运行时的重写引擎。 RewriteEngine On # 设置目录级重写的基准URL。 RewriteBase / # 将根域名跳转至www二级域名。 RewriteCond %{HTTP_HOST} ^codemonkey\.cn$ [NC] RewriteRule ^(.*)$ http://www.codemonkey.cn [L,R=301] # 处理www二级域名 RewriteCond %{HTTP_HOST} ^www\.codemonkey\.cn$ [NC] RewriteCond %{REQUEST_URI} !^/www/ [NC] RewriteRule ^(.*)$ www/$1 [L,QSA] # 处理blog二级域名 RewriteCond %{HTTP_HOST} ^blog\.codemonkey\.cn$ [NC] RewriteCond %{REQUEST_URI} !^/blog/ [NC] RewriteRule ^(.*)$ blog/$1 [L,QSA] </IfModule> |
下方配置已经失效:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<IfModule mod_rewrite.c> # 打开运行时的重写引擎。 RewriteEngine On # 设置目录级重写的基准URL。 RewriteBase / # 将codemonkey.cn跳转至www.codemonkey.cn。 RewriteCond %{HTTP_HOST} ^codemonkey\.cn$ RewriteCond %{QUERY_STRING} !^(.*)debug(.*)$ RewriteRule ^(.*)$ http://www.codemonkey.cn [R=301,L] # 将主域名(codemonkey.cn)的二级域名(www、blog)重写为二级目录。 # 检查主域名和二级域名,避免恶意CNAME。 RewriteCond %{HTTP_HOST} ^((www)|(blog))\.codemonkey\.cn$ # 检查请求路径是否以二级域名开头,不处理该类型请求,认为其已经处理过。 RewriteCond %{REQUEST_URI} !^/((www)|(blog))/.*$ # 将域名追加入请求路径。 RewriteRule ^(.*)$ __%{HTTP_HOST}__$1 [C] # 分离出上一步追加的域名,将其作为二级目录。 RewriteRule ^__([A-Za-z0-9\-]+)\.([A-Za-z0-9\-]+)\.([A-Za-z0-9\-]+)__(.*)$ $1/$4 [L] </IfModule> |
以下是mod_rewrite的语法:
mod_rewrite – Apache HTTP Server Version 2.4
mod_rewrite - Apache 2.2 中文版参考手册
另附上一个调试mod_rewrite的小技巧:
1 2 |
RewriteCond %{QUERY_STRING} vardump RewriteRule (.*) http://www.baidu.com/?host=%{HTTP_HOST},rurl=%{REQUEST_URI} [R=301,L,QSA] |