Apache重写规则和POST数据

3

我已经成功安装了一个URL重写策略,以下是包含在代码(.htaccess)中的内容:

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

然而,它正在丢失POST数据。我看到其他问题通过将完整的URL更改为相对路径(我的也是),或安装类似于MOD_PROXY的东西来解决这个问题。但是,如果可能的话,我想保持原样,不需要安装额外的apache模块。我也尝试过[NC,L]。
有什么想法吗?重写功能正常,但是我只是丢失了POST数据。然而,它仍将POST保留为请求方法。它还保留头文件,因为它通过了我正在构建的API的身份验证块。

是的。从技术上讲,没有尾斜杠(如果有影响),但是确实是有的。 - Nicholas Yost
可能是跨域脚本设置的问题吗?从技术上讲,它并不来自相同的主机名(因为我的REST程序是起始点,但任何REST实现都会有这个问题)。你知道我该如何检查吗? - Nicholas Yost
是的,如果域名改变了,那肯定是原因。在同一域中不可能发生这种情况。 - anubhava
我认为可能存在一些误解。我的意思是说,引荐者不是同一个域。当我进入页面时,域名没有改变。请求方法仍然是POST,但数据集为空。我想知道Apache(或PHP)是否能够看到引用页面不是同一个域,并出于安全原因丢弃POST变量。 - Nicholas Yost
你可以创建一个名为 info.php 的文件,其中包含以下代码 <?php phpinfo(); ?>,然后从浏览器中将数据发送到该文件以检查 POST 内容。 - anubhava
显示剩余18条评论
2个回答

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]

然后在 DocumentRoot 中创建 info.php 文件,内容如下:

<?php phpinfo(); ?>

最后,在DocumentRoot下创建一个名为form.html的表单,如下所示:

<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数据完整。


首先,感谢您发布正式回答。我不能接受评论作为答案。从域内发布始终有效,其中请求的来源与接收请求的域相同。但是,对于来自域外的请求,则不是这样。您能否尝试使用https://chrome.google.com/webstore/detail/rest-console/cokgbflfommojglbmbpenpphppikmonn?hl=en(或类似的工具,如我正在使用的PAW),以查看它是否仍然接受POST请求?我遇到的问题是来自域外的请求。 - Nicholas Yost
它也可以在那个REST控制台中工作。你只需要发送 Content-Type=application/x-www-form-urlencoded 头部即可。 - anubhava
现在它正在工作。我在重写中添加了QSA,并下载了另一个REST客户端。现在POST数据正在传递,到目前为止一切都正常工作。我无法感谢你的帮助,但从URL重写的更改和新客户端来看,它正在按预期工作。非常感谢您的所有帮助。 - Nicholas Yost
不用谢,很高兴最终你解决了问题。这对我来说也是一次有趣的讨论。 - anubhava

0

我知道这个帖子已经很老了,但我想再添加一个可能导致mod重写丢失POST数据的原因。

如果你的某些URL正常工作,甚至按预期保留POST数据,而其他URL则不行,请检查你的Apache错误日志。Apache可能会抛出“Negotiation: discovered file(s) matching request: /path/to/something (None could be negotiated)”错误。如果是这种情况,请打开你的Apache配置文件并关闭MultiViews选项,重新启动Apache,这可能会解决问题。这篇博客详细解释了这个问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接