Azure App Service虚拟目录URL重写至子域名的配置问题
解决Azure App Service中api.mydomain.com重定向到/api的循环问题
你的问题出在无限循环重定向上——当你访问api.mydomain.com时,规则会将其重定向到api.mydomain.com/api,但这个新请求的HTTP_HOST仍然是api.mydomain.com,且请求路径/api会被match url="(.*)"再次匹配,导致规则反复触发,最终App Service被大量循环请求占满,无法处理正常请求。
下面是两种针对不同需求的优化方案:
方案1:永久重定向(地址栏显示/api)
这个方案会让浏览器地址栏从api.mydomain.com变成api.mydomain.com/api,适合需要用户明确看到/api路径的场景。我们添加条件排除已经以/api/开头的请求,避免循环:
<rewrite> <rules> <rule name="Redirect to /api" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" pattern="^api.mydomain.com$" /> <!-- 排除已经是/api开头的请求,防止循环 --> <add input="{REQUEST_URI}" pattern="^/api/" negate="true" /> </conditions> <action type="Redirect" url="https://api.mydomain.com/api/{R:1}" redirectType="Permanent" /> </rule> </rules> </rewrite>
stopProcessing="true":确保匹配到这条规则后不再执行后续规则,提升效率negate="true":表示当请求路径不以/api/开头时才触发规则
如果你只需要将根路径(api.mydomain.com)重定向到/api,不需要处理其他子路径,可以简化规则:
<rewrite> <rules> <rule name="Redirect root to /api" stopProcessing="true"> <match url="^$" /> <!-- 仅匹配空的根路径 --> <conditions> <add input="{HTTP_HOST}" pattern="^api.mydomain.com$" /> </conditions> <action type="Redirect" url="https://api.mydomain.com/api" redirectType="Permanent" /> </rule> </rules> </rewrite>
方案2:内部重写(地址栏不变)
如果不需要改变浏览器地址栏,只是希望后台将api.mydomain.com的请求映射到/api目录,可以使用Rewrite类型的规则(相当于内部转发,用户无感知):
<rewrite> <rules> <rule name="Rewrite to /api" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" pattern="^api.mydomain.com$" /> <add input="{REQUEST_URI}" pattern="^/api/" negate="true" /> </conditions> <action type="Rewrite" url="/api/{R:1}" /> </rule> </rules> </rewrite>
部署注意事项
- 将修改后的
web.config放在wwwroot目录下,App Service会自动检测配置变化并重启应用 - 测试时可以使用浏览器的开发者工具(Network面板)查看重定向是否正常,避免循环
- 确保你的虚拟目录配置
wwwroot/api映射正常,避免重写/重定向后出现404错误
内容的提问来源于stack exchange,提问作者Alx
相关产品推荐
相关产品推荐

