首页 文章

如何在Express中获取完整的URL?

提问于
浏览
367

让我们说我的样本网址是

http://example.com/one/two

我说我有以下路线

app.get('/one/two', function (req, res) {
    var url = req.url;
}

url 的值为 /one/two .

如何在Express中获得 full url ?例如,在上面的例子中,我想收到 http://example.com/one/two .

13 回答

  • 13

    我使用节点包'url'(npm install url)

    它的作用是你打电话的时候

    url.parse(req.url, true, true)
    

    它将使您可以检索全部或部分网址 . 更多信息:https://github.com/defunctzombie/node-url

    我以下面的方式使用它来获取在http://www.example.com/之后的任何内容,以用作变量并拉出特定的配置文件(有点像facebook:http://www.facebook.com/username

    var url = require('url');
        var urlParts = url.parse(req.url, true, true);
        var pathname = urlParts.pathname;
        var username = pathname.slice(1);
    

    虽然为了这个工作,你必须在server.js文件中以这种方式创建你的路由:

    self.routes['/:username'] = require('./routes/users');
    

    并以这种方式设置您的路由文件:

    router.get('/:username', function(req, res) {
     //here comes the url parsing code
    }
    
  • 17

    Express behind proxies时,make req.host/req.hostname有效必须有两个条件:

    在app.js中

    • app.set('trust proxy', 'loopback');

    • X-Forwarded-Host 标头必须由您自己在网络服务器中指定 . 例如 . apache,nginx

    nginx

    server {
        listen myhost:80;
        server_name  myhost;
        location / {
            root /path/to/myapp/public;
            proxy_set_header X-Forwarded-Host $host:$server_port;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://myapp:8080;
        }
    }
    

    apache

    <VirtualHost myhost:80>
        ServerName myhost
        DocumentRoot /path/to/myapp/public
        ProxyPass / http://myapp:8080/
        ProxyPassReverse / http://myapp:8080/
    </VirtualHost>
    
  • 2

    我的代码看起来像这样,

    params['host_url'] = req.protocol + '://' + req.headers.host + req.url;

  • 5
    var full_address = req.protocol + "://" + req.headers.host + req.originalUrl;
    

    要么

    var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;`
    
  • 4

    我实际上发现通过使用下面的代码你可以得到你的网址 . 然后继续切片并决定下一步 .

    app.use(function(req, res, next) {
    console.log(req.originalUrl);
    res.send(req.originalUrl);
      });
    
  • 104

    您需要使用 req.headers.host + req.url 构造它 . 当然,如果你在不同的端口托管,这样你就会得到这个想法;-)

  • 6

    使用url.format

    var url = require('url');
    

    这支持所有协议并包括端口号 . 如果您的originalUrl中没有查询字符串,则可以使用此更干净的解决方案:

    var requrl = url.format({
        protocol: req.protocol,
        host: req.get('host'),
        pathname: req.originalUrl,
    });
    

    如果您有查询字符串:

    var urlobj = url.parse(req.originalUrl);
    urlobj.protocol = req.protocol;
    urlobj.host = req.get('host');
    var requrl = url.format(urlobj);
    
  • 577

    这是添加可以在req对象上调用以获取url的函数的好方法

    app.use(function(req, res, next) {
        req.getUrl = function() {
          return req.protocol + "://" + req.get('host') + req.originalUrl;
        }
        return next();
      });
    

    现在您有一个功能,您可以根据需要随时拨打电话 .

  • 5
    • 该协议可用作 req.protocol . docs here

    • 在Express 3.0之前,您可以假设协议为 http ,除非您看到 req.get('X-Forwarded-Protocol') 已设置且值为 https ,在这种情况下您知道这是您的协议

    • 主持人来自 req.get('host') ,正如Gopal指出的那样

    • 希望你没有't need a non-standard port in your URLs, but if you did need to know it you' d它在你的应用程序状态,因为它是你在服务器启动时传递给 app.listen 的任何东西 . 但是,在非标准端口上进行本地开发的情况下,Chrome似乎在主机头中包含端口,因此 req.get('host') 返回 localhost:3000 . 因此,至少对于标准端口上的 生产环境 站点并直接浏览到您的快速应用程序(没有反向代理)的情况, host Headers 似乎对URL中的端口做了正确的事情 .

    • 路径来自 req.originalUrl (感谢@pgrassant) . 请注意,此DOES包含查询字符串 . docs here on req.url and req.originalUrl . 根据您打算对URL执行的操作,与 req.url 相比, originalUrl 可能是也可能不是正确的值 .

    将这些组合在一起以重建绝对URL .

    var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
    
  • 30

    您可以改为使用the node.js API for URLs并传递 URL.format() 来自express的信息,而不是将这些事物连接在一起 .

    例:

    var url = require('url');
    
    function fullUrl(req) {
      return url.format({
        protocol: req.protocol,
        host: req.get('host'),
        pathname: req.originalUrl
      });
    }
    
  • 8

    我发现它有点像PITA来获取请求的URL . 我不敢相信快递没有更简单的方法 . 应该是req.requested_url

    但这是我如何设置它:

    var port = req.app.settings.port || cfg.port;
    res.locals.requested_url = req.protocol + '://' + req.host  + ( port == 80 || port == 443 ? '' : ':'+port ) + req.path;
    
  • 9

    用这个,

    var url = req.headers.host + '/' + req.url;
    
  • 6

    我建议使用originalUrl而不是URL:

    var url = req.protocol + '://' + req.get('host') + req.originalUrl;
    

    在这里查看originalUrl的描述:http://expressjs.com/api.html#req.originalUrl

    在我们的系统中,我们做这样的事情,所以originalUrl对我们很重要:

    foo = express();
      express().use('/foo', foo);
      foo.use(require('/foo/blah_controller'));
    

    blah_controller看起来像这样:

    controller = express();
      module.exports = controller;
      controller.get('/bar/:barparam', function(req, res) { /* handler code */ });
    

    所以我们的网址格式如下:

    www.example.com/foo/bar/:barparam
    

    因此,我们需要bar控制器获取处理程序中的req.originalUrl .

相关问题