【问题标题】:node js URL Parsing节点js URL解析
【发布时间】:2016-08-03 23:00:27
【问题描述】:

我正在尝试解析节点 js 中的 url。从此代码中获取空值。它正在接收路径的值。但不适用于主机或协议。,

var http = require('http');
var url = require('url');
http.createServer ( function (req,res){
    var pathname = url.parse(req.url).pathname;
    var protocol = url.parse(req.url).protocol;
    var host = url.parse(req.url).host;
    console.log("request for " + pathname + " recived.");
    console.log("request for " + protocol + " recived.");
    console.log("request for " + host + " recived.");
    res.writeHead(200,{'Content-Type' : 'text/plain'});
    res.write('Hello Client');
    res.end();
 }).listen(41742);
 console.log('Server Running at port 41742');
 console.log('Process IS :',process.pid);

【问题讨论】:

  • 您能给我们举一个不起作用的 URL 的示例,并且您还让控制台记录了 req.url 吗?
  • HTTP 协议不会在一个值中传递组合 URL 以供 Node 解析。在req.url 中只给出了路径和可选的查询字符串(对于GET /foo 请求,req.url === "/foo")。 Host 在请求标头中,至少在 HTTP 1.1 及更高版本中。
  • 那么如何打印主机和协议呢?谢谢

标签: javascript node.js express


【解决方案1】:

HTTP protocol 不会在一个值中传达组合 URL 以供 Node 解析。

例如,对http://yourdomain.com/home 的请求以以下方式到达:

GET /home HTTP/1.1
Host yourdomain.com
# ... (additional headers)

所以,这些碎片不会都在同一个地方。

  • 您可以从 req.url 获得的路径和查询字符串,正如您所做的那样 - 对于上面的示例,它将包含 "/home"

    var pathname = url.parse(req.url).pathname;
    
  • 您可以从 req.headers 获得的主机,但它并不总是需要一个值。

    var hostname = req.headers.host || 'your-domain.com';
    
  • 对于协议,此值没有标准放置。

    您可以使用“How to know if a request is http or https in node.js”中给出的建议来确定httphttps

    var protocol = req.connection.encrypted ? 'https' : 'http';
    

    或者,虽然它不是标准的,但许多客户端/浏览器会为其提供 X-Forwarded-Proto 标头。

【讨论】:

    【解决方案2】:

    req.url 只包含路径而不是整个 url。 其余在请求标头中。

    • 对于主机:console.log(req.headers["host"]);

    • 对于协议:console.log(req.headers["x-forwarded-proto"]);

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 2018-10-23
        • 1970-01-01
        • 1970-01-01
        • 2018-02-26
        • 2017-11-24
        • 2016-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多