EDIT.
后来尝试使用cloudfront功能here https://stackoverflow.com/a/76958086/13583510并认为这是一个更好的方法
问题是 API Gateway’s WebSocket API does not support a path parameter in the connection URL. By design (or say it a design oversight), the connection URL path is fixed to the root path / (stage would be prepended when execute-api endpoint is used).
正如本文中提到的中等文章 https://medium.com/@lancers/amazon-api-gateway-websocket-api-cloudfront-function-ab304fd95ac3.
简单来说就是尝试连接wss://x5g9h3p2rq.execute-api.eu-central-1.amazonaws.com/dev/my-socket/?param1=1¶m2=test
会给出相同的403 禁忌 . Only wss://x5g9h3p2rq.execute-api.eu-central-1.amazonaws.com/dev/?param1=1¶m2=test
or wss://x5g9h3p2rq.execute-api.eu-central-1.amazonaws.com/dev?param1=1¶m2=test
works.
即当我尝试连接时wss://app.blablabla.cloud/dev/my-socket/?param1=1¶m2=test
它必须尝试连接到wss://x5g9h3p2rq.execute-api.eu-central-1.amazonaws.com/dev/my-socket/?param1=1¶m2=test
So 方法1
- 在行为改变中路径图案 -
/dev
并降低优先级,以便其余的dev/stuff/*
不受影响。
- 现在我能够做到
wss://app.blablabla.cloud/dev?param1=1¶m2=test
但这是不可扩展的。如果我们需要另一个套接字 API 该怎么办?我们不能使用相同的/dev
对于一切。
这会带来更好的结果方法2
Using Lambda@Edge
- 保持路径模式的行为 -
/dev/my-socket/*
.
- 创建 Lambda@Edge 并将其与原产地要求
- lambda 很简单,只需更改
uri
from /dev/my-socket/
to /dev
'use strict';
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
request.uri = request.uri.replace(/\/[^\/]+\/$/, '');
return callback(null, request);
};
- 现在我能够做到
wss://app.blablabla.cloud/dev/my-socket/?param1=1¶m2=test
它会剥离my-socket
并转发到正确的原点。
- 此外,Lambda 仅在连接调用期间被调用。握手完成后,Lambda 不再参与。
- 还注意到与直接使用 API 网关 URL 相比,这种方法有轻微的延迟