这里分享一个采坑经历,希望能帮助到要踩坑的你。。。
前不久在阿里云看到了中文域名,觉得好玩就买了一个来玩玩(主要因为便宜)。买了域名备案了,也解析了多个子域名,想通过ngxin实现多个网站的对应多个子域名。那故事来了
我的部分配置大致如下:
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name _;
return 404
}
server {
listen 80;
server_name dev.中文域名.top
}
server {
listen 80;
server_name test.中文域名.top
}
}
配置是理想的,结果却是意外的,不管是访问 dev.中文域名.top
还是 test.中文域名.top
都是404,真想来一句FK。但是答案总是留给有准备的人,我在一篇博客中找到了答案,如下:
现在的浏览器里面主动加入了中文域名自动转码,使用的一种叫做punycode码。同时因为操作系统的核心都是英文组成,DNS服务器的中文域名解析,也会把中文域名转成punycode码,然后由DNS解析punycode码。
那什么是Punycode码?
Punycode是一个根据RFC 3492标准而制定的编码系统,主要用于把域名从地方语言所采用的Unicode编码转换成为可用于DNS系统的编码。 "中文域名"后缀不被标准的解析服务器支持,需转化为punycode码进行解析。
中文域名变为Punycode编码即可,在线转码地址:http://tools.jb51.net/punycode/
总结:我们的nginx
配置是没有问题的,问题在于中文域名,nginx
不识别中文域名,在server_name
中无法完成匹配,所以都是返回第一个server_name
,这也是nginx
的一个机制吧,在所有的server_name
无法匹配时,默认是匹配第一个。所以只需要把中文域名转为Punycode
编码,然后再去nginx
配置转后的域名,就可以了。