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

Apache URL无尾斜杠时POST转GET,重写规则无法保留POST数据求助

解决Apache下无尾斜杠POST请求被转为GET的问题

问题本质

你遇到的是Apache默认的目录重定向行为:当请求指向一个真实存在的目录但URL末尾不带斜杠时,Apache会返回301永久重定向到带斜杠的地址。而根据HTTP规范,301重定向会自动把POST请求转为GET,导致你的index.php无法获取请求体,数据插不进数据库。

你之前添加的307规则未生效,核心原因有两个:一是规则写在了单个订单目录的<Directory>块里,订单ID是动态的,规则根本匹配不到请求;二是规则的匹配逻辑没有针对目录请求做精准判断。

可行的配置方案

方案1:在apache2.conf中配置全局规则(推荐)

把规则放到/py/order/层级的<Directory>块下,覆盖所有子订单目录:

<Directory /var/www/html/py/order/>
   AllowOverride All
   Require all granted
   Options +FollowSymlinks

   RewriteEngine On
   # 仅对真实存在的目录生效,且URL末尾无斜杠
   RewriteCond %{REQUEST_FILENAME} -d
   RewriteCond %{REQUEST_URI} !/$
   # 307重定向保留原请求方法和请求体
   RewriteRule ^(.*)$ /$1/ [L,R=307]
</Directory>

方案2:用.htaccess配置(适合共享主机场景)

如果服务器允许.htaccess生效(已开启AllowOverride All),在/var/www/html/py/order/目录下新建或修改.htaccess文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*)$ /$1/ [L,R=307]

配置后操作

修改完配置后,必须重启Apache让规则生效:

sudo systemctl restart apache2

验证效果

配置正确的话,再发送无尾斜杠的POST请求,Apache日志会显示如下内容,请求方法将保持POST不变:

186.139.yy.xx - - [04/May/2023:07:xx:xx -0300] "POST /py/order/ORDER-0001 HTTP/1.1" 307 0 "-" "PostmanRuntime/7.32.2"
186.139.yy.xx - - [04/May/2023:07:xx:xx -0300] "POST /py/order/ORDER-0001/ HTTP/1.1" 200 4964 "-" "PostmanRuntime/7.32.2"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:35:19