通过WSO2 APIM网关发起CORS请求无法获取Content-Length头
解决方案:让WSO2 APIM传递Content-Length响应头
针对你的场景——直接调用后端Apache HTTPD能拿到Content-Length,但经WSO2 APIM网关后丢失,即使配置了CORS暴露头也无效,可按以下步骤排查解决:
禁用网关的分块传输编码
WSO2 APIM默认会开启分块传输(Transfer-Encoding: chunked),这种模式下Content-Length头会被自动忽略。你可以:- 全局配置:在网关的
deployment.toml中添加[apim.gateway]段配置:[apim.gateway] enable_chunking = false - 单API配置:如果不想全局修改,可在API Publisher界面进入目标API的「高级设置」,添加
DISABLE_CHUNKING属性并设为true,或者修改API的impl文件添加该配置。
- 全局配置:在网关的
检查调解策略是否移除了响应头
排查是否有自定义调解逻辑删掉了Content-Length:- 登录API Publisher,打开目标API的「Manage」→「Mediation Policies」,检查入站/出站流里有没有类似
<property name="Content-Length" action="remove"/>的配置,有就删掉。 - 同时检查全局调解序列(比如
_auth.xml、_token.xml),确保没有全局移除该头的逻辑。
- 登录API Publisher,打开目标API的「Manage」→「Mediation Policies」,检查入站/出站流里有没有类似
排查响应压缩导致的头丢失
如果后端Apache HTTPD启用了gzip压缩,WSO2 APIM可能会重新处理响应,导致Content-Length丢失:- 暂时关闭后端的压缩功能,测试是否能正常获取Content-Length。
- 或者在网关的
deployment.toml中禁用响应压缩:[apim.gateway] enable_response_compression = false
确认CORS配置生效
虽然你已经添加了Content-Length到expose_headers,但要确保配置无拼写错误:- 检查
deployment.toml的[apim.cors]段:[apim.cors] enable = true expose_headers = "Content-Length, Content-Type" # 按需添加其他头 - 重启网关后,用浏览器开发者工具查看响应:先确认
Access-Control-Expose-Headers包含Content-Length,再检查响应头里是否实际存在Content-Length(如果网关根本没传递这个头,暴露配置也没用)。
- 检查
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

