Azure APIm带尾随斜杠请求返回307,如何配置返回404?
解决Azure APIm尾随斜杠请求返回307暴露原始链接的问题
可以通过配置APIm策略实现你的需求——让非预期场景返回404,仅在主动配置时使用307。以下是两种可行方案:
方案一:入站策略拦截非法请求直接返回404
在API的入站策略中添加逻辑,检查请求URL是否带尾随斜杠且未匹配到合法端点,直接返回404,避免触发默认重定向行为。
示例策略代码:
<inbound> <choose> <when condition="@(context.Request.Url.Path.EndsWith("/") && !context.Api.Operations.Any(op => op.Method.Equals(context.Request.Method, StringComparison.OrdinalIgnoreCase) && op.UrlTemplate.Equals(context.Request.Url.Path.TrimEnd('/'), StringComparison.OrdinalIgnoreCase)))"> <return-response> <set-status code="404" reason="Not Found" /> <set-body>{"error": "指定资源不存在"}</set-body> <set-header name="Content-Type" exists-action="override"> <value>application/json</value> </set-header> </return-response> </when> </choose> <!-- 保留原有入站策略 --> </inbound>
该策略会:
- 检测请求URL是否以斜杠结尾
- 验证去掉斜杠后的路径+请求方法是否匹配当前API定义的合法操作
- 若未匹配,直接返回404响应,阻止请求转发到后端
方案二:拦截后端重定向并替换为404
如果307是后端服务返回的,可通过策略阻止APIm跟随重定向,并将307响应替换为404:
<backend> <!-- 禁止APIm自动跟随后端重定向 --> <forward-request follow-redirects="false" /> </backend> <outbound> <choose> <when condition="@(context.Response.StatusCode == 307)"> <return-response> <set-status code="404" reason="Not Found" /> <set-body>{"error": "指定资源不存在"}</set-body> <set-header name="Content-Type" exists-action="override"> <value>application/json</value> </set-header> </return-response> </when> </choose> <!-- 保留原有出站策略 --> </outbound>
推荐方案
优先选择方案一,因为它能在请求进入APIm的早期阶段拦截非法请求,避免不必要的后端交互,同时精准控制哪些请求返回404,完全符合你“仅主动配置时使用307”的要求。
内容的提问来源于stack exchange,提问作者SoulCub
相关产品推荐
相关产品推荐

