假设我的示例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。


当前回答

使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>

其他回答

2021年

上面的答案工作得很好,但不是首选的文档,因为url。解析现在是遗留的,所以我建议你使用新的URL()函数,如果你想获得更多的控制URL。

表达方式

您可以从下面的代码获得完整的URL。

`${req.protocol}://${req.get('host')}${req.originalUrl}`

示例URL: http://localhost:5000/a/b/c?d=true&e=true#f=false

固定属性(你将在所有路线上得到相同的结果)

req.protocol: http
req.hostname: localhost
req.get('Host'): localhost:5000
req.originalUrl: /a/b/c?d=true&e=true
req.query: { d: 'true', e: 'true' }

非固定属性(将在每条路由中改变,因为它由express自己控制)

路线:/

req.baseUrl: <blank>
req.url: /a/b/c?d=true&e=true
req.path: /a/b/c

路线/

req.baseUrl: /a
req.url: /b/c?d=true&e=true
req.path: /b/c

文档:http://expressjs.com/en/api.html req.baseUrl

URL封装方式

在URL函数中,您将在每个路由中得到相同的结果,因此属性总是固定的。

属性

const url = new URL(`${req.protocol}://${req.get('host')}${req.originalUrl}`);
console.log(url)

您将得到如下结果。我根据图像改变了属性的顺序,这样它就可以匹配图像流。

URL {
  href: 'http://localhost:5000/a/b/c?d=true&e=true',
  protocol: 'http:',
  username: '',
  password: '',
  hostname: 'localhost',
  port: '5000',
  host: 'localhost:5000',
  origin: 'http://localhost:5000',
  pathname: '/a/b/c',
  search: '?d=true&e=true',
  searchParams: URLSearchParams { 'd' => 'true', 'e' => 'true' },
  hash: ''
}

注意:散列不能发送到服务器,因为它在服务器中被视为片段,但你会在客户端浏览器中获得。

文档:https://nodejs.org/api/url.html url_new_url_input_base

我发现它有点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;

你可以结合req。协议,要求。主机名和req.originalUrl。请注意要求。主机名,而不是请求。Host或req.get(“Host”),这是可行的,但更难阅读。

const completeUrl = `${req.protocol}://${req.hostname}${req.originalUrl}`;

你可以使用node.js API来获取url,并将来自express的信息传递给URL.format(),而不是自己将这些东西连接在一起。

例子:

var url = require('url');

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

我的代码是这样的,

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