在AMH4.2中,关于二级域名自动绑定子目录的功能上,存在一个缺陷,带有-字符的域名无法实现”二级域名自动绑定到子目录”功能。
在AMH4.2中,有一项功能是二级域名自动绑定到子目录,例如
http://wap.baddb.com/
会自动指定到 /home/wwwroot/baddb.com/web/wap/ 目录。
通常使用没有问题。但是作者发现,如果域名中涉及到 – 字符,则该功能会失效。原因是AMH的开发者在设计时没有考虑到关于 – 字符的匹配表达。例如:
http://wap.bad-db.com/
通过开启和关闭“二级域名绑定子目录”功能
可以发现,该功能的实现,是依赖于对应站点的.conf文件中是多了以下这行正则表达式
if ( $host ~* "(?:(\w+\.){0,})(\b(?!www\b)\w+)\.\b(?!(com|org|gov|net|cn)\b)\w+\.[a-zA-Z]+" ) { set $subdomain "/$2"; }
而对于 – 字符的不支持,正是因为这行规则存在遗漏。改为以下规则即可
if ( $host ~* "(?:(\w+\.){0,})(\b(?!www\b)\w+)\.\b(?!(com|org|gov|net|cn)\b)[a-z\-0-9]+\.[a-zA-Z]+" ) { set $subdomain "/$2"; }
然后比较麻烦的是,此次修改完成后,如果后期对虚拟站点又作了其它的设置改动,例如又加了新的一个二级域名,或者更改了php-fpm线程大小之类的,进行了保存,则规则又自动变回原先的错误表达式。不胜其烦。幸好,NGINX可以引用.conf,而AMH上则直接可以用Amrewrite来完成。
处理方法:
1:取消对应站点“二级域名绑定子目录”的勾选。
2:在Amrewrite中,创建一个新的.conf 给对应站点调用,如果站点本身已经有其它.conf调用,那么直接修改原.conf,在最前加上以下规则即可
if ( $host ~* "(?:(\w+\.){0,})(\b(?!www\b)\w+)\.\b(?!(com|org|gov|net|cn)\b)[a-z\-0-9]+\.[a-zA-Z]+" ) { set $subdomain "/$2"; }
扩展阅读:
假如遇到二级域名与子目录文件夹名不同的情况下,有没有办法指定绑定呢?例如 bbs.baddb.com 对应的不是 baddb.com/web/bbs/ ,而是 baddb.com/web/forum ,或 wap.baddb.com 对应的不是 baddb.com/web/wap/ 而是 baddb.com/web/shouji ,答案是肯定的。如下
if ( $host = 'bbs.baddb.com' ){ set $subdomain "/forum"; } if ( $host = 'wap.baddb.com' ){ set $subdomain "/shouji"; }
甚至,可以将二级域名再重新指回根目录
if ( $host = 'test.baddb.com' ){ set $subdomain "/"; }