使用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.
相关产品推荐
相关产品推荐

