我正在西里尔文域上开发一个网络应用程序。目前,该域托管一个“停放页面”,表示该站点正在建设中。如果我在 Chrome 中访问它,我会在地址栏中看到 punycode。不过,Safari 会对其进行解码。出于开发目的,我修改了我的/etc/hosts
文件,以便能够通过测试西里尔文域访问 localhost。但是,Chrome 和 Safari 都无法解码主机名。
我已经查找了这个问题,但找不到任何明智的解决方案。Node.js 有一个名为punycode
. 现在,如果 myreq.url
包含西里尔字符,它会被URIComponent
编码,因此我编写了一个中间件来解码它:
app.use(function(req, res, next) {
var url = req.url,
decoded = decodeURIComponent(url);
if (url !== decoded) req.url = decoded;
next();
});
它工作正常,我现在可以使用西里尔文路由。但是当我尝试将此逻辑应用于主机名时,它不起作用:
app.use(function(req, res, next) {
var hostname = req.hostname,
decoded = punycode.toUnicode(hostname);
if (hostname !== decoded) req.hostname = decoded;
// I have also tried return res.redirect('https://' + decoded + ':' + ...);
next();
});
很感谢任何形式的帮助。谢谢!