Nodejs在win7下得不到完整req.url

Nodejs在win7下得不到完整req.url

1、最简单的例子代码 test.js: <pre> var http = require(‘http’); var url = require(‘url’); http.createServer(function (req, res) { console.log(req.url); console.dir(url.parse(req.url)); res.writeHead(200, {‘Content-Type’: ‘text/plain’}); res.end(‘Hello World\n’); }).listen(1234); console.log(‘Server running at http://127.0.0.1:1234/’); </pre>

2、在你的Win7安装路径下找到hosts(例如:C:\Windows\System32\drivers\etc\hosts),加入以下两行: <pre> 127.0.0.1 mysite1.mydomain 127.0.0.1 mysite2.mydomain </pre>

3、运行test.js <pre> node test.js </pre>

4、在浏览器中尝试以下url: <pre> http://mysite1.mydomain:1234/mypath http://mysite2.mydomain:1234/mypath http://127.0.0.1:1234/mypath </pre>

你会发现,3个url都可以得到响应,但console中输出的hostname、port、protocol全都是null。</br> 为什么呀?! 在WinXP下没这问题呀! 有别人遇到同样问题吗? 有什么设置可以解决吗?


5 回复

Node.js 在 Win7 下得不到完整 req.url

问题描述

在 Windows 7 系统中使用 Node.js 开发时,可能会遇到一个奇怪的现象:即使请求能够正常响应,req.url 却不能正确解析出完整的 URL,导致 hostname, port, 和 protocol 字段为空。

示例代码

首先,我们创建一个简单的 Node.js HTTP 服务器来测试这个问题:

// test.js
var http = require('http');
var url = require('url');

http.createServer(function (req, res) {
    console.log(req.url);
    var parsedUrl = url.parse(req.url);
    console.dir(parsedUrl);

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1234);

console.log('Server running at http://127.0.0.1:1234/');

配置 hosts 文件

接下来,在你的 Windows 7 安装路径下的 hosts 文件中添加以下两行:

127.0.0.1   mysite1.mydomain
127.0.0.1   mysite2.mydomain

确保你具有管理员权限才能编辑 hosts 文件。

运行服务器

然后,通过命令行运行服务器脚本:

node test.js

测试请求

打开浏览器并尝试访问以下 URL:

http://mysite1.mydomain:1234/mypath
http://mysite2.mydomain:1234/mypath
http://127.0.0.1:1234/mypath

观察现象

你会发现,尽管所有三个 URL 都能正常响应,但是在控制台输出中,hostname, port, 和 protocol 字段都显示为 null 或者空字符串。这与在 Windows XP 中的表现不同。

原因分析

这是因为 Node.js 默认情况下仅解析标准的 URL 格式(如 http://example.com/path)。当你使用自定义域名(如 mysite1.mydomain)时,Node.js 并不会自动解析这些信息到 req.url 的对象中。它只会简单地将原始请求的 URL 路径部分打印出来。

解决方案

为了获取完整的 URL 信息,你需要手动解析请求头中的 Host 字段。你可以通过以下方式修改服务器代码来实现:

http.createServer(function (req, res) {
    const fullUrl = req.protocol + '://' + req.headers.host + req.url;
    console.log(fullUrl);
    
    // 继续解析 URL 的其他部分
    var parsedUrl = url.parse(req.url);
    console.dir(parsedUrl);

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1234);

这样,你就能在控制台中看到完整的 URL 信息了。

结论

通过这种方式,你可以解决在 Windows 7 下使用 Node.js 时无法正确解析完整 URL 的问题。希望这个解决方案对你有所帮助。


貌似不是req.url orginalUrl好像叫这个

解决了:<br/> 用Node本身的 req.headers.host 或者 Express提供的 req.host, req.protocol 可以得到有意义的值。<br/> req.url 和 req.orginalUrl 都不包含protocol、hostname、port,Win7下与WinXP下是一样的。<br/> <pre> // req.headers.host: mysite1.mydomain:1234 console.log(‘req.headers.host:%s’, req.headers.host);

// req.protocol: http, req.host: mysite1.mydomain, req.subdomains: console.log(‘req.protocol:%s, req.host:%s, req.subdomains:%s’, req.protocol, req.host, req.subdomains);

// req.originalUrl: /mypath, req.url: /mypath console.log(‘req.originalUrl:%s, req.url:%s’,req.originalUrl, req.url); </pre>

本来req.url里就不会有你要的那些信息,自己去读读HTTP协议规范就知道了,req.url其实不是你想象的url

在Node.js中,req.url只包含请求URL的路径部分(从域名和端口之后的部分),并不会包含主机名、端口或协议等信息。因此,在您的代码中,console.log(req.url)console.dir(url.parse(req.url))只会输出路径部分,而不会输出主机名、端口或协议。

为了获取完整的URL信息,包括主机名、端口和协议等,您需要结合req.socket.remoteAddressreq.headers.host等属性来获取这些信息。但是,如果您想直接解析完整的URL,可以考虑使用完整的请求字符串。

以下是修改后的示例代码:

var http = require('http');
var url = require('url');

http.createServer(function (req, res) {
    var fullUrl = 'http://' + req.headers.host + req.url;
    console.log(fullUrl);
    console.dir(url.parse(fullUrl));

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1234);

console.log('Server running at http://127.0.0.1:1234/');

在这个示例中,我们通过req.headers.host获取了完整的主机名和端口,并将其与req.url组合成一个完整的URL。然后,我们使用url.parse(fullUrl)来解析完整的URL,并打印出来。这样,您就可以在控制台中看到完整的URL信息了。

请注意,这种方法假设请求是通过HTTP进行的。如果您的服务器支持HTTPS,您可能需要根据具体情况调整代码。

回到顶部