Azure Web App含空格编码的URL触发404/500错误求解决
解决Azure Web App URL重写编码问题的思路
1. 调整重写规则的解码行为
IIS默认会提前解码URL中的特殊字符,导致+或%20在重写前被篡改,引发404/500错误。修改重写规则,添加decodeUrl="false"保留原始编码,同时开启appendQueryString="true"传递查询参数:
<rewrite> <rules> <rule name="All to root" stopProcessing="true"> <match url="(.*)" decodeUrl="false" /> <action type="Rewrite" url="index.php" appendQueryString="true" /> </rule> </rules> </rewrite>
2. 允许IIS处理编码后的特殊字符
默认IIS会拦截包含%20的路径请求(视为非法字符),导致500错误。在web.config的<system.webServer>节点下添加请求过滤配置,允许双重转义:
<security> <requestFiltering allowDoubleEscaping="true"> <requestLimits maxUrl="4096" maxQueryString="2048" /> </requestFiltering> </security>
3. 修正PHP的请求路径获取逻辑
确保PHP代码通过$_SERVER['REQUEST_URI']获取原始请求路径,而非$_SERVER['PATH_INFO']或$_SERVER['REQUEST_PATH']——IIS重写后会修改这些变量的值,导致路径解析错误。
4. 兼容路径中的+号(可选)
如果需要让IIS将路径中的+视为空格(和Apache行为一致),可以添加前置重写规则替换+为%20:
<rewrite> <rules> <rule name="Replace plus with space" stopProcessing="false"> <match url="^(.*)\+(.*)$" /> <action type="Rewrite" url="{R:1}%20{R:2}" /> </rule> <rule name="All to root" stopProcessing="true"> <match url="(.*)" decodeUrl="false" /> <action type="Rewrite" url="index.php" appendQueryString="true" /> </rule> </rules> </rewrite>
内容的提问来源于stack exchange,提问作者Aleks G
相关产品推荐
相关产品推荐

