Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Hapi中获取请求的完整URL_Url_Hapijs - Fatal编程技术网

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

如何在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

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

函数getRequestUrl(请求){ return…;//这里是什么? }
我发现我可以从
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谢谢,更新了我的答案,并添加了一条关于代理的说明。@MattHarrison
request.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;