假设我的示例网址是
我说我有以下路线
app.get('/one/two', function (req, res) {
var url = req.url;
}
值url
将是/one/two
。
如何在Express中获取完整的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
。
Answers:
该协议可作为req.protocol
。这里的文档
http
除非您看到req.get('X-Forwarded-Protocol')
已设置并具有value 的协议,否则可以假定为该协议https
,在这种情况下,您知道这是您的协议主机来自req.get('host')
Gopal指示
希望您在URL中不需要非标准端口,但是如果您确实需要知道它,则可以将其置于应用程序状态,因为这是app.listen
在服务器启动时传递给您的。但是,在使用非标准端口进行本地开发的情况下,Chrome似乎将端口包含在主机标头中,因此例如req.get('host')
返回localhost:3000
。因此,至少对于在标准端口上的生产站点并直接浏览到快速应用程序(没有反向代理)的情况,host
标头似乎对URL中的端口做了正确的处理。
路径来自req.originalUrl
(感谢@pgrassant)。请注意,此DOES包含查询字符串。此处有关req.url和req.originalUrl的文档。根据您打算对URL originalUrl
进行的操作,与相比,该值可能是正确的值,也可能不是正确的值req.url
。
将所有内容组合在一起以重建绝对URL。
var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
req.get('Host')
代替req.host
主机和端口部分。
host
可以欺骗请求标头中的参数。如果使用res.host
这种方式,则可能会发生“主机头攻击” 。在Django框架中,它们具有一个“允许的主机”变量,用于防止此类攻击。我使用一个配置变量,root_url
可以将其添加到中req.url
以完成操作。关于攻击:skeletonscribe.net/2013/05/...
req.originalUrl
不带参数的对象,只需执行req.originalUrl.split("?").shift()
。资料来源:stackoverflow.com/a/32118818/2037431
您可以将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
});
}
req.get('host')
仅返回主机名部分,而不返回端口。不知道为什么,但是现在我从设置中收集端口号,并使用hostname
字段代替host
。
pathname
,我认为你的意思是path
。其中包括搜索/查询字符串
我发现获取请求的网址有点像PITA。我不敢相信没有比这更简单的表达方式了。应该只是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.port
存在?它不在Express文档中吗?
req.app.settings.port
使用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);
这是添加可以在req对象上调用以获取url的函数的好方法
app.use(function(req, res, next) {
req.getUrl = function() {
return req.protocol + "://" + req.get('host') + req.originalUrl;
}
return next();
});
现在,您有了一个可以按需调用的功能。
当Express在代理之后时,使req.host/req.hostname有效必须具有两个条件:
app.set('trust proxy', 'loopback');
在app.js中X-Forwarded-Host
标头必须由您自己在网络服务器中指定。例如。apache,nginxnginx:
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;
}
}
阿帕奇:
<VirtualHost myhost:80>
ServerName myhost
DocumentRoot /path/to/myapp/public
ProxyPass / http://myapp:8080/
ProxyPassReverse / http://myapp:8080/
</VirtualHost>
127.0.0.1
从req.get('host')
用这个,
var url = req.headers.host + '/' + req.url;
我建议使用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控制器get处理程序中使用req.originalUrl。
我使用节点包“ 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
}
您可以在这样的路线中使用此功能
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}`;
req.protocol
将为您提供http或https,
req.headers.host
将为您提供完整的主机名,例如www.google.com,
req.originalUrl
将为您提供其余名称pathName
(以您为例/one/two
)
仅下面的代码对我来说就足够了!
const baseUrl = `${request.protocol}://${request.headers.host}`;
// http://127.0.0.1:3333