Nodejs http模块 ie下提交的带中文参数的url不识别

Nodejs http模块 ie下提交的带中文参数的url不识别

代码如下:

var http = require('http');
http.createServer(function (req, res) {
  console.log(req.url);
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337);
console.log('Server running at 1337');

windows7和linux下的node 版本都是0.6.18

浏览器中输入的地址是http://127.0.0.1:1337/contacts?id=中文 用ie9和firefox20.0.1访问windows7下的node服务器时页面正常显示 ie9访问时服务器打印了访问的url"/contacts?id=“ firefox20.0.1访问时服务器打印了访问的url”/contacts?id=%E4%B8%AD%E6%96%87" 但用ie9和firefox20.0.1访问linux下的node服务器时 ie9显示不出页面,服务器端也没有打印访问的url firefox20.0.1一切正常 在网上找了下说是ie的bug,对url的中的中文参数没有encode 但是为什么windows7下的node能正常使用啊 想问一下大家有没有遇到类似的问题,还是说我linux下编译的node有问题


2 回复

Node.js HTTP 模块 IE 下提交的带中文参数的 URL 不识别

问题描述

在使用 Node.js 的 http 模块时,发现 IE 浏览器在提交带有中文参数的 URL 时,Node.js 服务器无法正确解析这些参数。而在 Firefox 和 Windows 7 环境下,同样的代码可以正常工作。

示例代码

var http = require('http');

http.createServer(function (req, res) {
  console.log(req.url); // 打印请求的 URL
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337);

console.log('Server running at 1337');

环境信息

  • Windows 7 和 Linux 上的 Node.js 版本均为 0.6.18。
  • 使用的浏览器版本:
    • IE9
    • Firefox 20.0.1

问题表现

  1. Windows 7 下:

    • IE9 访问时,服务器端只打印出 URL 中文部分的前半部分(例如 /contacts?id=)。
    • Firefox 20.0.1 访问时,URL 被正确编码为 %E4%B8%AD%E6%96%87
  2. Linux 下:

    • IE9 访问时,页面无法正常显示,并且服务器端没有打印任何请求的 URL。
    • Firefox 20.0.1 访问时,一切正常。

分析与解决方案

IE 浏览器在处理 URL 编码方面存在一些已知问题,特别是对于非 ASCII 字符(如中文字符)。以下是几种可能的解决方法:

  1. 客户端编码: 在客户端将 URL 参数进行编码,确保所有非 ASCII 字符都被正确编码。例如,在发送请求之前使用 JavaScript 的 encodeURIComponent() 函数进行编码:

    var url = 'http://127.0.0.1:1337/contacts?id=' + encodeURIComponent('中文');
    window.location.href = url;
    
  2. 服务器端解码: 在服务器端接收 URL 后,使用 decodeURIComponent() 对 URL 进行解码,以确保能够正确读取中文字符:

    var url = req.url;
    var query = url.split('?')[1]; // 获取查询字符串
    var params = new URLSearchParams(query);
    var id = decodeURIComponent(params.get('id')); // 解码参数
    console.log(id); // 输出中文字符
    

通过以上方法,可以确保 IE 浏览器在提交带有中文参数的 URL 时,Node.js 服务器能够正确解析这些参数。


根据你的描述,问题在于IE浏览器在处理包含中文字符的URL时没有进行正确的编码。IE9在处理这类URL时,未能正确地将中文字符转换为URL编码(例如%E4%B8%AD%E6%96%87),从而导致Node.js服务器无法正确解析这些参数。

解决方案

在发送请求之前,确保所有非ASCII字符都被正确地进行了URL编码。你可以使用JavaScript内置的encodeURIComponent()函数来实现这一点。

示例代码

客户端(浏览器)代码示例:

var id = "中文";
var encodedId = encodeURIComponent(id);
var url = `http://127.0.0.1:1337/contacts?id=${encodedId}`;
window.location.href = url;

Node.js 服务器代码

服务器端代码无需改动,因为req.url已经包含了完整的URL字符串,只是不同的浏览器处理方式不同。Node.js会自动解码URL参数。

var http = require('http');
http.createServer(function (req, res) {
    console.log(req.url); // 输出完整解码后的URL
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337);
console.log('Server running at 1337');

关于不同操作系统的行为差异

问题可能与操作系统的默认字符编码有关。Windows通常使用GBK编码,而Linux系统则使用UTF-8编码。这可能导致不同浏览器在处理URL时表现出不同的行为。因此,使用encodeURIComponent()可以确保无论浏览器或操作系统如何,都能正确地处理URL中的中文字符。

回到顶部