假设我的示例URL是

http://example.com/one/two

我说我有以下路线

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

url的值是/one/two。

如何在Express中获得完整的URL ? 例如,在上面的情况下,我想收到http://example.com/one/two。


当前回答

下面的代码对我来说就足够了!

const baseUrl = `${request.protocol}://${request.headers.host}`;
// http://127.0.0.1:3333

其他回答

你可以像这样在路由中使用这个函数

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

/**
 * Gets the self full URL from the request
 * 
 * @param {object} req Request
 * @returns {string} URL
 */
const getFullUrl = (req) => `${req.protocol}://${req.headers.host}${req.originalUrl}`;

要求的事情。Protocol会给出HTTP或https, Req.headers.host会给你完整的主机名,比如www.google.com, 要求的事情。originalUrl会给出剩下的路径名(在你的例子中是/one/two)

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

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

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

它将给你检索url的全部或部分的可能性。更多信息请访问: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
}

这里有一个添加函数的好方法,你可以调用req对象来获取url

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

现在,您有了一个可以在需要时按需调用的函数。

使req.host /点播。当Express后台代理时,主机名有效必须满足两个条件:

App.set('信任代理','环回');在app.js x - forward - host头必须由你自己在webserver中指定。如。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>

The protocol is available as req.protocol. docs here Before express 3.0, the protocol you can assume to be http unless you see that req.get('X-Forwarded-Protocol') is set and has the value https, in which case you know that's your protocol The host comes from req.get('host') as Gopal has indicated Hopefully you don't need a non-standard port in your URLs, but if you did need to know it you'd have it in your application state because it's whatever you passed to app.listen at server startup time. However, in the case of local development on a non-standard port, Chrome seems to include the port in the host header so req.get('host') returns localhost:3000, for example. So at least for the cases of a production site on a standard port and browsing directly to your express app (without reverse proxy), the host header seems to do the right thing regarding the port in the URL. The path comes from req.originalUrl (thanks @pgrassant). Note this DOES include the query string. docs here on req.url and req.originalUrl. Depending on what you intend to do with the URL, originalUrl may or may not be the correct value as compared to req.url.

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

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