如何获得完整的url在Express?

假设我的示例url是

http://example.com/one/two

我说我有以下路线

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

url的值将是/one/two url

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

  1. 该协议可作为req.protocol 。 文档在这里

    1. 在Express 3.0之前,除非你看到req.get('X-Forwarded-Protocol')被设置并且具有值https ,否则你可以假定为http req.get('X-Forwarded-Protocol') ,在这种情况下,你知道这是你的协议
  2. 主机来自req.get('host') Gopal指出

  3. 希望你的URL不需要一个非标准的端口,但是如果你确实需要知道它的话,那么你的应用程序状态就是这样,因为它是在服务器启动时传给app.listen的任何东西。 但是,在非标准端口上进行本地开发的情况下,Chrome似乎将主机端口包含在主机头中,例如, req.get('host')返回localhost:3000 。 因此,至less在标准端口上生产站点的情况下,直接浏览到您的快速应用程序(无需反向代理), host标题似乎在URL中对端口做了正确的事情。

  4. path来自req.originalUrl (谢谢@pgrassant)。 注意这个包含查询string。 关于req.url和req.originalUrl的文档 取决于您打算如何处理URL,与req.url相比, originalUrl可能是也可能不是正确的值。

将所有这些结合在一起来重build绝对URL。

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

您可以改为使用node.js API作为URL,并通过URL.format()从express中传递信息,而不是将它们连接在一起。

例:

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

我发现它有点PITA来获取请求的url。 我不能相信有一个更简单的方法来expression。 应该只是req.requested_url

但这是我如何设置它:

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

使用url.format :

 var url = require('url'); 

这支持所有协议并包括端口号。 如果您在originalUrl中没有查询string,则可以使用此清理解决scheme:

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

如果你有一个查询string:

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

这是一个很好的方式来添加一个函数,你可以调用req对象来获取url

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

现在你有一个function,你可以根据需要调用,如果你需要它。

你需要使用req.headers.host + req.url来构build它。 当然,如果你在一个不同的端口主机,这样你的想法;-)

使req.host/req.hostname有效时必须有两个条件当Express后面的代理 :

  1. app.set('trust proxy', 'loopback'); 在app.js中
  2. X-Forwarded-Host头必须由您自己在Web服务器中指定。 例如。 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> 

用这个,

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

我build议使用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 */ }); 

所以我们的URL有以下格式:

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

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

我的代码看起来像这样,

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

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

它是什么时候打电话

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

它会给你检索全部或部分url的可能性。 更多信息在这里: https : //github.com/defunctzombie/node-url

我以下面的方式使用它来获取/ http://www.example.com/中的/作为variables,并拉起一个特定的configuration文件(有点像Facebook:; http://www.facebook。 com /用户名 )

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

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

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

并设置你的路线文件这种方式:

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

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

 app.use(function(req, res, next) { console.log(req.originalUrl); res.send(req.originalUrl); }); 
 var full_address = req.protocol + "://" + req.headers.host + req.originalUrl; 

要么

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