我在ALB后面有一个lambda目标。我的lambda是python lambda。
def handler(event, context):
response = {
"statusCode": 200,
"statusDescription": "200 OK",
"isBase64Encoded": False,
"headers": {
"Content-Type": "text/html; charset=utf-8"
}
}
使用curl击中我的网址时,我会收到
< HTTP/1.1 200 OK
< Server: awselb/2.0
< Date: Sat, 06 Apr 2019 04:46:50 GMT
< Content-Type: application/octet-stream
< Content-Length: 0
< Connection: keep-alive
注释Content-Type
是一个八位字节流,它使浏览器将响应下载为文件而不是显示。我尝试将其他标头"Foo":"Bar"
添加到响应中,但它们未显示在curl响应中。 ALB似乎正在吃我的lambda提供的标题。我该如何解决?
答案 0 :(得分:0)
AWS Application Load Balancer将所有响应标头转换为小写,您需要仔细检查标头。不幸的是,您不能更改或修改标头是由ALB操纵的。您可以在下面的链接中获取HTTP标头:
https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html
用于应用程序负载均衡器的请求跟踪:
此外,您需要检查负载均衡器的限制:
负载均衡器在收到传入请求时更新标头,而不是在收到响应时更新标头。
如果HTTP标头大于7 KB,则负载平衡器将使用Root字段重写X-Amzn-Trace-Id标头。
使用WebSockets,您只能跟踪直到升级请求成功为止。
答案 1 :(得分:0)
结果是我为目标组打开了多值标头。启用该设置后,我的Lambda需要返回设置了字段multiValueHeaders
而不是headers
的响应。所以我的lambda代码必须是:
def handler(event, context):
response = {
"statusCode": 200,
"statusDescription": "200 OK",
"isBase64Encoded": False,
"multiValueHeaders": {
["Content-Type": "text/html; charset=utf-8"]
}
}
更多信息here。