【问题标题】:Apache Rewrite Rule and POST DataApache 重写规则和 POST 数据
【发布时间】:2014-08-22 09:04:27
【问题描述】:

我已成功安装 URL 重写策略,我已将其包含在下面 (.htaccess):

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

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

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

【问题讨论】:

  • 你在浏览器中看到了什么 URL,你想把它改写成什么?
  • 我正在使用 PAW(我购买的一个 REST API 程序以方便使用),但我的意图是保持 URL 的重写(而不是重定向)。我把 {domain}/rest/queue/new.xml 放在了输出页面上(所以路由正常工作,我只是丢失了 POST 数据)。即使使用重写,我也确实有标题工作。有什么具体的我可以提供帮助的吗?
  • POST 数据不会在内部重写中丢失,如上所示。还有更多规则吗?
  • 不。这就是整个 .htaccess 文件(也是唯一的 .htaccess 文件)。我确认该方法是使用 REQUEST_METHOD 产生“post”的 POST,但是当我执行 print_r($_POST) 时,我得到一个空数组。我执行 print_r($_REQUEST) 来获取所有 POST 和 GET(以防我使用的程序合并它们或其他东西),我只从重写规则(params 和 v)中获取两者。
  • 我可以提供任何来自 phpinfo() 的值来提供帮助吗?

标签: php apache .htaccess mod-rewrite vps


【解决方案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]

然后在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 数据。

【讨论】:

  • 首先,感谢您发布正式答案。我不能接受 cmets 作为答案。从域内部发布始终有效,其中请求的来源与请求的接收者是同一域。但是,对于来自域外的请求,它不是。您可以尝试使用chrome.google.com/webstore/detail/rest-console/…(或类似的东西,比如我正在使用的 PAW)来查看它是否仍然接受 POST 吗?它的请求来自我遇到问题的域之外。
  • 它也可以从那个休息控制台工作。您只需要发送Content-Type=application/x-www-form-urlencoded 标头即可。
  • 它现在可以工作了。我将 QSA 添加到重写中,并下载了另一个 REST 客户端。现在 POST 数据正在通过,到目前为止一切正常。我非常感谢您,但是从 URL 重写和新客户端的更改中,它按预期工作。非常感谢您的帮助。
  • 不客气,很高兴它最终对你有用。这对我来说也是一个有趣的讨论。
【解决方案2】:

我知道这个线程有多老了,但我想添加另一个可能导致 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

【讨论】:

    猜你喜欢
    • 2011-09-02
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多