如何在 Hapi 中获取请求的完整 URL

How to get the full URL for a request in Hapi

在我的 hapijs 应用程序中,给定一个 Request object,我如何找到原始的、未解析的、未修改的 URL?

function getRequestUrl (request) {
    return ...; // What goes here?
}

我发现我可以从 Request.info.hostRequest.pathRequest.query 中将它拼凑起来,但它缺少方案(即 http 与 https),并且有点麻烦。普通的 URL 在某处可用吗?

我现在使用以下语法(使用咖啡脚本):

server.on 'response', (data) ->
  raw = data.raw.req
  url = "#{data.connection.info.protocol}://#{raw.headers.host}#{raw.url}"
  console.log "Access to #{url}"

或javascript:

​server.on('response', function(data) {
  var raw = data.raw.req;
  var url = data.connection.info.protocol + "://" + 
  raw.headers.host + raw.url;
  console.log("Access to " + url);
});

这为您提供了与用户要求完全一样的 URL。

完整的 URL 没有存储在您可以获取的地方。您需要自己从以下部分构建它:

const url = request.connection.info.protocol + '://' + request.info.host + request.url.path;

尽管它可能看起来很笨拙,但如果您考虑一下它是有道理的,因为 没有原始的、未解析的、未修改的 URL。通过线路传输的 HTTP 请求不包含 URL,如在浏览器地址栏中输入的那样:

GET /hello?a=1&b=2 HTTP/1.1      // request.url.path
Host: localhost:4000             // request.info.host
Connection: keep-alive
Accept-Encoding: gzip, deflate, sdch
...

而你只能根据hapi服务器连接是否处于TLS模式来了解协议(request.connection.info.protocol)。

注意事项

如果您勾选:

request.connection.info.urirequest.server.info.uri

报告的主机名将是服务器 运行 所在的实际机器的主机名(hostname 在 *nix 上的输出)。如果您想要在浏览器中输入的实际主机(可能不同),您需要检查从 HTTP 请求的主机 header)

解析的 request.info.host

代理和 X-Forwarded-Proto header

如果您的请求通过代理/负载 balancers/HTTPS 终止符传递,则 HTTPS 流量可能在某处终止并通过 HTTP 连接发送到您的服务器,在这种情况下,您''ll want use the value of the x-forwarded-proto header if it's there:

const url = (request.headers['x-forwarded-proto'] || request.connection.info.protocol) + '://' + request.info.host + request.url.path;

使用模板字符串:

const url = `${request.headers['x-forwarded-proto'] || request.connection.info.protocol}://${request.info.host}${request.url.path}`;

您无法获得 URL。你必须生成它。我正在使用这个:

const url = request.headers['x-forwarded-proto'] + '://' +
            request.headers.host + 
            request.url.path;

hapi-url 解决了这个问题。它准备在代理后面与 X-Forwarded headers 到 运行 一起工作。如果库无法正确解析 URL,还有一个选项可以覆盖自动解析。

现在只有 request.url:

https://hapi.dev/api?v=20.2.0#-requesturl