如何在Hapi中获取请求的完整URL
在我的hapijs应用程序中,给定一个,如何找到原始的、未经分析的、未修改的URL 函数getRequestUrl(请求){ return…;//这里是什么? }如何在Hapi中获取请求的完整URL,url,hapijs,Url,Hapijs,在我的hapijs应用程序中,给定一个,如何找到原始的、未经分析的、未修改的URL 函数getRequestUrl(请求){ return…;//这里是什么? } 我发现我可以从Request.info.host、Request.path、和Request.query,将其组合在一起,但它缺少方案(即http与https),有点混乱。普通URL不是在某处可用吗?我现在使用以下语法(使用coffee脚本): 或作为javascript: server.on('response', functi
我发现我可以从
Request.info.host
、Request.path
、和Request.query
,将其组合在一起,但它缺少方案(即http与https),有点混乱。普通URL不是在某处可用吗?我现在使用以下语法(使用coffee脚本):
或作为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
报告的主机名将是运行服务器的实际计算机的主机名(*nix上的hostname
on的输出)。如果您想要在浏览器中键入的实际主机(可能不同),则需要选中从HTTP请求的主机头解析的request.info.host
)
代理和X-Forwarded-Proto头文件
如果您的请求通过代理/负载平衡器/HTTPS终止器传递,则HTTPS通信可能会在某个位置终止,并通过HTTP连接发送到您的服务器,在这种情况下,您需要使用x-forwarded-proto
头的值,如果它存在:
consturl=(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;
解决了这个问题。它准备使用X-Forwarded头在代理后运行。如果库无法正确解析URL,还可以选择覆盖自动解析。
request.connection.info.protocol
不是很好的解决方案。如果您需要更好地获取协议,请使用request.headers['x-forwarded-proto']
@Petroff谢谢,更新了我的答案,并添加了一条关于代理的说明。@MattHarrisonrequest.info.host
给了我localhost而不是域名,但在'x-forwarded-server':“my domain com”
你能解释为什么吗?在最新的hapi
版本中不起作用。但是hapi-url确实如此,见里贡的答案。干得好。有几点建议:1。重写resolve
prototype方法时,请通过Object.defineProperty
使其不可数。2.将空检查添加到HapiUrl.init
。您已经进行了类型检查,但是由于typeof null==“object”
,如果调用HapiUrl.init(null)
,您将得到一个运行时错误。我不明白您所说的“使其不可数”是什么意思。你能提供更多的细节吗?我在GitHub上创建了一个问题来讨论这一点:
const url = request.headers['x-forwarded-proto'] + '://' +
request.headers.host +
request.url.path;