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

