如何获得完整的网址在快递?

假设我的示例URL是

http://example.com/one/two

我说我有以下路线

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

url的值将是/one/two

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

697804 次浏览

您需要使用req.headers.host + req.url来构造它。当然,如果你是在不同的端口,你得到的想法;-)

  1. 协议为req.protocol。# EYZ1

    1. 在express 3.0之前,您可以假定协议为http,除非您看到设置了req.get('X-Forwarded-Protocol')并具有https的值,在这种情况下,您知道这就是您的协议
    2. 李< / ol > < / >
    3. 正如Gopal所指出的,宿主来自req.get('host')

    4. 希望您的url中不需要非标准端口,但如果您确实需要知道它,那么您应该在应用程序状态中拥有它,因为它是您在服务器启动时传递给app.listen的任何东西。然而,在非标准端口上的本地开发的情况下,Chrome似乎包括在主机头中的端口,因此req.get('host')返回localhost:3000,例如。因此,至少对于在标准端口上的生产站点并直接浏览您的express应用程序(没有反向代理)的情况下,host头文件似乎对URL中的端口做了正确的事情。

    5. 路径来自req.originalUrl(感谢@pgrassant)。注意这确实包括查询字符串。docs here on req。url和req.originalUrl。与req.url相比,originalUrl可能是也可能不是正确的值,这取决于您打算对URL做什么。

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

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

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

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

例子:

var url = require('url');


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

我的代码是这样的,

# EYZ0

我建议使用originalUrl而不是URL:

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

参见originalUrl的描述: # EYZ0 < / p >

在我们的系统中,我们这样做,所以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

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

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

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

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

我使用节点包'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
}

使用# EYZ0:

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);

用这个,

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

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

  1. app.set('trust proxy', 'loopback');在app.js
  2. X-Forwarded-Host头必须由你自己在webserver中指定。如。apache, nginx

# EYZ0:

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;
}
}

# EYZ0:

<VirtualHost myhost:80>
ServerName myhost
DocumentRoot /path/to/myapp/public
ProxyPass / http://myapp:8080/
ProxyPassReverse / http://myapp:8080/
</VirtualHost>
var full_address = req.protocol + "://" + req.headers.host + req.originalUrl;

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

谢谢大家提供这些信息。这是非常烦人的。

把这个添加到你的代码中,你就再也不用考虑它了:

var app = express();


app.all("*", function (req, res, next) {  // runs on ALL requests
req.fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl
next()
})

您还可以在那里执行或设置其他操作,例如将日志记录到控制台。

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

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
async function (request, response, next) {
const url = request.rawHeaders[9] + request.originalUrl;
//or
const url = request.headers.host + request.originalUrl;
}

2021年

上面的答案工作得很好,但不是文档的首选,因为url.parse现在是legacy,所以我建议你使用new URL()函数,如果你想对url有更多的控制。

高速公路

您可以从下面的代码中获得Full 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自己控制)

路线:# EYZ0

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

# EYZ0路线

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

文档:# EYZ0

URL Package Way

.

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

属性

enter image description here

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: ''
}

请注意: Hash不能发送到服务器,因为它在服务器中被视为Fragment,但你会在客户端意味着浏览器中获得。

文档:# EYZ0

通常我依赖这2个,取决于服务器和代理是否存在:

# EYZ0

# EYZ0

const fullUrl = `${protocol}://${host}:${port}${url}`
      

const responseString = `Full URL is: ${fullUrl}`;
res.send(responseString);
})

您可以组合req.protocolreq.hostnamereq.originalUrl。注意req.hostname而不是req.hostreq.get("host"),这是可行的,但更难阅读。

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

你可以从req of express得到完整的url。

function fetchPages(req, res, next) {


let fullUrl = req.headers.host + req.originalUrl;
console.log("full url ==> ",fullUrl);
}

我试着把所有数据都记录下来以备不时之需

然后我发现日志rawHeaders和发现所有的数据可用的url

我试了一下

app.post("/news-letter", (req,res) => {
console.log(req.body);
res.redirect(req.rawHeaders[33]);
})