You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RewriteRule重定向POST请求时出现500内部服务器错误

问题分析与解决方案

500内部服务器错误的根源

你写的RewriteRule标志里有语法问题:[QSA, L, R=307]中逗号后面的空格是不允许的。Apache的RewriteRule多标志之间用逗号分隔,但逗号前后不能加空格,否则服务器会把带空格的部分识别为无效标志,直接抛出500错误。修正后的正确规则应该是:

RewriteEngine On
RewriteRule . /src/routes.php [QSA,L,R=307]

移除参数后无法读取POST数据的原因

当你去掉[QSA, L, R=307]这些参数时,RewriteRule默认执行内部重写(不是外部跳转)——Apache直接把请求转发给/src/routes.php,不会通知浏览器跳转。这时候无法通过php://input读取POST数据,大概率是因为:

  • PHP默认会解析application/x-www-form-urlencoded类型的POST数据,把内容填充到$_POST数组里,同时清空php://input的内容。如果你的代码先访问了$_POST,再去读php://input就会读到空。
  • 要是你必须读取原始POST数据,要么确保代码先读取php://input再访问$_POST,要么检查PHP配置里的enable_post_data_reading是否开启(默认是开的)。

另外,如果你要的是浏览器可见的外部重定向且保留POST数据,必须用R=307——307是唯一能保留请求方法和POST数据的临时重定向状态码,用302的话浏览器会自动把POST转成GET,直接丢数据。

额外建议

  • 确认Apache已经启用mod_rewrite模块,否则RewriteRule根本不会生效。
  • 网站根目录的Apache配置要允许.htaccess生效,也就是AllowOverride得设为All或者包含FileInfo。
  • 可以加个条件避免循环重定向,防止/src/routes.php自己被重定向:
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/src/routes.php$
    RewriteRule . /src/routes.php [QSA,L,R=307]
    

内容的提问来源于stack exchange,提问作者Vit.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:07:25