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有问题
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
问题表现
-
Windows 7 下:
- IE9 访问时,服务器端只打印出 URL 中文部分的前半部分(例如
/contacts?id=
)。 - Firefox 20.0.1 访问时,URL 被正确编码为
%E4%B8%AD%E6%96%87
。
- IE9 访问时,服务器端只打印出 URL 中文部分的前半部分(例如
-
Linux 下:
- IE9 访问时,页面无法正常显示,并且服务器端没有打印任何请求的 URL。
- Firefox 20.0.1 访问时,一切正常。
分析与解决方案
IE 浏览器在处理 URL 编码方面存在一些已知问题,特别是对于非 ASCII 字符(如中文字符)。以下是几种可能的解决方法:
-
客户端编码: 在客户端将 URL 参数进行编码,确保所有非 ASCII 字符都被正确编码。例如,在发送请求之前使用 JavaScript 的
encodeURIComponent()
函数进行编码:var url = 'http://127.0.0.1:1337/contacts?id=' + encodeURIComponent('中文'); window.location.href = url;
-
服务器端解码: 在服务器端接收 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中的中文字符。