Apache重写规则和POST数据

时间:2014-07-01 17:50:46

标签: php apache .htaccess mod-rewrite vps

我已经成功安装了一个URL重写策略,我在下面包含了这个策略(.htaccess):

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^rest/([\w\d~%.:_\/-]+)$ controllers/rest_api.php?params=$1&v=t [NC]

然而,它正在丢失POST数据。我已经看到其他问题通过将FULL url更改为相对的(我的是),或者通过安装类似MOD_PROXY的东西来解决这个问题。但是,如果可能的话,我想保留这个,而无需安装额外的apache mod。我也试过[NC,L]。

有什么想法吗? Rewrite正在运行,但我只是丢失了POST数据。但是,它将POST保留为request_method。它还保留了标题,因为它通过了我正在构建的API的身份验证块。

2 个答案:

答案 0 :(得分:1)

您可能需要2个重写条件才能停止重写有效文件和目录。

实际上没有任何特殊设置可以使POST正常工作。只需在DocumentRoot中创建一个.htaccess

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^rest/([\w\d~%.:/-]+)$ info.php?params=$1&v=t [L,QSA]

然后在info.php中创建DocumentRoot

<?php phpinfo(); ?>

最后在form.html

下创建一个名为DocumentRoot的表单
<html><body>
<form method="post" action="/rest/queue/submit.xml?locations=this%20is%20a%20test">
   <input type="text" name="foo" value="foo"><br />
   <input type="text" name="bar" value="bar"><br />
   <input type="text" name="baz" value="baz"><br />
   <input type="submit" name="go" value="Submit">
</form>
</body></html>

最后在浏览器中打开localhost/form.html,然后点击提交。它将打开localhost/info.php并显示您的POST数据完好无损。

答案 1 :(得分:0)

我知道此线程的年龄,但是我想为mod重写增加另一个可能导致丢失POST数据的潜在原因。

如果您的某些URL正常运行,甚至按预期维护POST数据,而其他URL则无法正常运行,请检查Apache错误日志。 Apache可能会抛出“协商:发现的文件匹配请求:/ path / to / something(无法协商)。”如果是这种情况,请打开您的Apache配置文件并关闭MultiViews选项,然后重新启动Apache,这可能会解决此问题。该博客更详细地解释了。

https://www.bennadel.com/blog/2218-negotiation-discovered-file-s-matching-request-none-could-be-negotiated.htm