中文域名在nginx配置中踩的一个坑

这里分享一个采坑经历,希望能帮助到要踩坑的你。。。
前不久在阿里云看到了中文域名,觉得好玩就买了一个来玩玩(主要因为便宜)。买了域名备案了,也解析了多个子域名,想通过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配置转后的域名,就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值