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下没这问题呀! 有别人遇到同样问题吗? 有什么设置可以解决吗?
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.remoteAddress
、req.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,您可能需要根据具体情况调整代码。