我正在尝试为之前由nginx反向代理处理的东西设置一个AWS API网关。我的端点是VPC内的EC2实例。我已经设置好了,这样网关就可以访问这些实例。
以前的nginx设置看起来是这样的:
http {
server {
listen 80;
location /host1/ {
proxy_pass http://host1:8000/;
}
location /host2/ {
proxy_pass http://host2:8070/;
}
...
}
}
当我试图重写请求路径时,问题就出现了。我在Gateway中设置了一个测试路由:ANY /test/{proxy+}
,并将其传递给相应的EC2实例。我已经验证了,请求通过了,但它们包含请求的完整路径:
# machine 1:
curl -v 'https://<endpoint>.amazonaws.com/test/hello_world/test/a'
< HTTP/2 404
< date: Sat, 18 Dec 2021 09:21:42 GMT
< content-type: text/html;charset=utf-8
< content-length: 469
< server: SimpleHTTP/0.6 Python/3.7.10
< apigw-requestid: Kic2FiLIFiAEN_g=
<
--- response ---
# server:
192.168.9.6 - - [18/Dec/2021 09:15:05] "GET /test/hello_world/test/a HTTP/1.1" 404 -
(404是预期的,重要的部分是请求击中服务器(
然后,我尝试使用参数映射重写请求路径以删除前导CCD_ 2:;所有传入请求";,要修改的参数:path
,修改类型:overwrite
,值:$request.path.proxy
(路由中定义的catch-all字段(。
现在我收到了一个400错误,请求不再到达我的服务器:
# machine 1:
curl -v 'https://<endpoint>.amazonaws.com/test/hello_world/test/a'
< HTTP/2 400
< date: Sat, 18 Dec 2021 09:19:53 GMT
< content-type: text/html
< content-length: 122
< server: awselb/2.0
< apigw-requestid: KiclDhxXFiAEMhg=
<
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
</body>
</html>
# server:
-nothing-
当我将$request.path.proxy
映射到querystring.path
而不是path
时,请求会到达服务器:
# machine 1:
curl -v 'https://<endpoint>.amazonaws.com/test/hello_world/test/a'
< HTTP/2 404
< date: Sat, 18 Dec 2021 09:21:42 GMT
< content-type: text/html;charset=utf-8
< content-length: 469
< server: SimpleHTTP/0.6 Python/3.7.10
< apigw-requestid: Kic2FiLIFiAEN_g=
<
--- response ---
# server:
192.168.9.6 - - [18/Dec/2021 09:21:42] "GET /test/hello_world/test/a?path=hello_world%2Ftest%2Fa HTTP/1.1" 404 -
请注意,path
查询参数的值正是我想要替换原始请求路径的正确值。
这是AWS的一个错误,还是我只是缺少了一些文档,说明您不能以这种方式重写路径?值得注意的是,当{proxy+}
路径参数为空时,请求将正确路由通过。。。
问题出在path
重写的值上:它应该是/$request.path.proxy
而不是$request.path.proxy
。