完整的 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
or request.server.info.uri
报告的主机名将是服务器正在运行的实际计算机的主机名(输出hostname
在 *nix 上)。如果您想要在浏览器中输入的人的实际主机(可能不同),您需要检查request.info.host
从 HTTP 请求的 Host 标头解析)
代理和 X-Forwarded-Proto 标头
如果您的请求通过代理/负载均衡器/HTTPS 终止符传递,则 HTTPS 流量可能会被终止并通过 HTTP 连接发送到您的服务器,在这种情况下,您需要使用以下值这x-forwarded-proto
标头(如果存在):
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}`;