替换Node.js+中的主机名;Express.js解码punycode域

替换Node.js+中的主机名;Express.js解码punycode域,node.js,express,middleware,idn,punycode,Node.js,Express,Middleware,Idn,Punycode,我正在西里尔语域上开发一个web应用程序。目前,该域名拥有一个“停靠页面”,表示该网站正在建设中。如果我在Chrome中访问它,我会在地址栏中看到punycode。不过,Safari解码了它。出于开发目的,我修改了我的/etc/hosts文件,以便能够通过测试西里尔语域访问localhost。然而,Chrome和Safari都无法解码主机名 我曾研究过这个问题,但找不到任何合理的解决办法。Node.js有一个名为punycode的模块。现在,如果我的req.url包含西里尔字符,它会得到URIC

我正在西里尔语域上开发一个web应用程序。目前,该域名拥有一个“停靠页面”,表示该网站正在建设中。如果我在Chrome中访问它,我会在地址栏中看到punycode。不过,Safari解码了它。出于开发目的,我修改了我的
/etc/hosts
文件,以便能够通过测试西里尔语域访问localhost。然而,Chrome和Safari都无法解码主机名

我曾研究过这个问题,但找不到任何合理的解决办法。Node.js有一个名为
punycode
的模块。现在,如果我的
req.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();
});

非常感谢您的帮助。谢谢

好吧,经过研究,我发现这几乎是不可能的。主机解析策略严格针对特定浏览器,并且(针对IDN)可防止危险的网络钓鱼活动。一方面,Safari将IDN从punycode解析为UTF-8字符串,另一方面,Chrome则没有

这些危险的网络钓鱼活动可能来自包含非ASCII字符的域。考虑一组ASCII字母“O,E,A”和UTF-8俄罗斯人(西里尔字母)。它们看起来几乎相同,因此对客户来说无法区分。因此,黑客可能会注册一个看起来像知名域名的域名(“paypal.com”带有ASCII“a”,而“pаypаl.com”带有UTF-8西里尔字母“а”)

为了防止此类恶意活动,Chrome将非ASCII字符编码为punycode(“pаypаl.com”和UTF-8西里尔字母“аa”在浏览器地址栏中看起来像“xn--pypl-53dc.com”,以警告客户端它不是原始网站)


唉,到目前为止,IDN似乎不是最好的解决方案。

好的,所以经过研究,我发现这几乎是不可能的。主机解析策略严格针对特定浏览器,并且(针对IDN)可防止危险的网络钓鱼活动。一方面,Safari将IDN从punycode解析为UTF-8字符串,另一方面,Chrome则没有

这些危险的网络钓鱼活动可能来自包含非ASCII字符的域。考虑一组ASCII字母“O,E,A”和UTF-8俄罗斯人(西里尔字母)。它们看起来几乎相同,因此对客户来说无法区分。因此,黑客可能会注册一个看起来像知名域名的域名(“paypal.com”带有ASCII“a”,而“pаypаl.com”带有UTF-8西里尔字母“а”)

为了防止此类恶意活动,Chrome将非ASCII字符编码为punycode(“pаypаl.com”和UTF-8西里尔字母“аa”在浏览器地址栏中看起来像“xn--pypl-53dc.com”,以警告客户端它不是原始网站)


唉,到目前为止,IDN似乎不是最好的解决方案。

您有正在测试的西里尔语主机的示例吗?您有正在测试的西里尔语主机的示例吗?