如何在 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.host
、Request.path
和 Request.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.uri
或 request.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
:
在我的 hapijs 应用程序中,给定一个 Request
object,我如何找到原始的、未解析的、未修改的 URL?
function getRequestUrl (request) {
return ...; // What goes here?
}
我发现我可以从 Request.info.host
、Request.path
和 Request.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.uri
或 request.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
: