如何获得完整的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
。
-
该协议可作为
req.protocol
。 文档在这里- 在Express 3.0之前,除非你看到
req.get('X-Forwarded-Protocol')
被设置并且具有值https
,否则你可以假定为http
req.get('X-Forwarded-Protocol')
,在这种情况下,你知道这是你的协议
- 在Express 3.0之前,除非你看到
-
主机来自
req.get('host')
Gopal指出 -
希望你的URL不需要一个非标准的端口,但是如果你确实需要知道它的话,那么你的应用程序状态就是这样,因为它是在服务器启动时传给
app.listen
的任何东西。 但是,在非标准端口上进行本地开发的情况下,Chrome似乎将主机端口包含在主机头中,例如,req.get('host')
返回localhost:3000
。 因此,至less在标准端口上生产站点的情况下,直接浏览到您的快速应用程序(无需反向代理),host
标题似乎在URL中对端口做了正确的事情。 -
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后面的代理 :
-
app.set('trust proxy', 'loopback');
在app.js中 -
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;`
- 允许CORS REST请求到Heroku上的Express / Node.js应用程序
- Express.js在MEAN栈中做什么?
- 如何使用node.js和express来上传,显示和保存图像
- 正确的方法来设置响应状态和JSON内容的REST API使用nodejs和express
- Express.js中res.send和res.json之间的区别
- 自动HTTPS连接/redirect与node.js / express
- 无法连接到127.0.0.1:27017,原因是:errno:111连接被拒绝
- HtmlWebpackPlugin注入加载非根网站path时破坏的相对path文件
- SyntaxError:预期expression式,得到'<'