解析中文域名并配置 Nginx 服务器

部署中文域名站点,下面讲诉设置中文域名站点——“郝越.我爱你”。

设置域名解析

第一步是在设置域名 A 记录,使主机记录中的 @ 和 www 都指向一个 ip。

域名解析

上图为万网域名解析后台解析设置

设置 Nginx server_name

第二步是修改 nginx/conf/nginx.conf 或者其他 vhost 文件,在 server_name 这一行调整为经过 idn_to_ascii 函数编码的中文域名,而不是原始的中文域名。

server {
		listen       80;
		server_name  xn--vq3al9d.xn--6qq986b3xl;
		index index.php;
		root /alidata/www/love;
}

“郝越.我爱你”经过编码之后是“xn--vq3al9d.xn--6qq986b3xl”。

在百度搜索“中文域名编码”,进入在线编码的网站,提交中文域名,即可将中文域名转为 punycode 或者是 GBK 编码。在 nginx 配置文件中使用 punycode 即可。

设置完成之后 reload nginx,即可访问中文域名。

访问中文域名

在浏览器地址栏看到的虽然是中文域名,但实际的链接是 http://xn--vq3al9d.xn--6qq986b3xl 。通过 JavaScript document.domain 获取到的域名也是 “xn--vq3al9d.xn--6qq986b3xl”,两者其实是同一个,通过任何一个地址都能访问到服务器。

扩展:使用 PHP 进行中文域名编码

使用 PHP 进行中文域名编码

国际化域名。

比如中文域名,在浏览器地址栏以中文显示,但实际是以 punycode 进行解析和访问。服务器设置 server_name 时不能直接设置中文域名,而是设置中文域名对应的 punycode。

PHP 提供的 IDN 函数可以把非英文域名转换为 punycode,详见 PHP IDN Functions

idn_to_ascii 将域名转换为 IDNA ASCII 编码
idn_to_unicode idn_to_utf8 别名
idn_to_utf8 将域名 从 ASCII 编码转换为 Unicode 编码

代码示例

$xn_idn = idn_to_ascii('郝越.我爱你');
echo $xn_idn; // xn--vq3al9d.xn--6qq986b3xl

$idn = idn_to_utf8($xn_idn);
echo $idn; // 郝越.我爱你

使用 IDN 函数之前需要先安装 php5-intl 扩展:

sudo apt-get install php5-intl