添加IIS重写规则后PHP POST请求失效问题求助
解决IIS重写规则导致PHP POST请求失效的问题
听起来你遇到的这个问题挺常见的——配置隐藏.php后缀的重写规则后,POST提交数据直接失效了。我来帮你拆解下问题根源,再给出针对性的修复方案。
问题出在哪?
你的第二个规则Redirecting .php ext用了**重定向(Redirect)**动作,默认情况下IIS会用302临时重定向处理,这个状态码会把原本的POST请求强制转换成GET请求,直接导致POST数据丢失,自然没法正常提交了。另外规则的顺序和条件设置也有小瑕疵,可能触发不必要的无效重定向。
修复后的完整规则配置
把你的规则调整成下面这样,就能解决POST失效的问题:
<rule name="Hide .php ext" stopProcessing="true"> <match url="^(.*)$" ignoreCase="true" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{REQUEST_FILENAME}.php" matchType="IsFile" /> </conditions> <action type="Rewrite" url="{R:1}.php" /> </rule> <rule name="Redirecting .php ext" stopProcessing="true"> <match url="^(.*)\.php$" ignoreCase="true" /> <conditions> <add input="{REQUEST_METHOD}" pattern="GET" /> <add input="{URL}" pattern="(.*)\.php" /> </conditions> <action type="Redirect" url="{R:1}" redirectType="Permanent" /> </rule>
关键调整说明
- 给第一个规则加
stopProcessing="true":匹配到隐藏后缀的规则后直接停止后续规则处理,避免多余的无效判断。 - 重定向规则新增请求方法条件:只对GET请求做
.php后缀的重定向,POST请求直接跳过这个规则,从根源上避免POST被转成GET。 - 修正正则表达式:把
^(.*).php改成^(.*)\.php$,精准匹配结尾的.php后缀,避免错误匹配类似filephpp这类异常路径。 - 设置永久重定向类型:如果有SEO需求,301永久重定向比临时重定向更友好;不需要的话也可以改成
Temporary,核心是确保POST请求不触发重定向。
额外检查项
- 确认IIS的URL重写模块已经正确安装并启用。
- 测试POST请求时,可以用浏览器开发者工具或Postman查看请求状态码,确认没有被意外重定向。
- 如果你的PHP代码依赖
REQUEST_URI等服务器变量,重写后这些变量会更新,确保代码逻辑兼容这种变化。
内容的提问来源于stack exchange,提问作者Sheikh Saadi
相关产品推荐
相关产品推荐

