1

我有这样的规则:

RewriteCond %{HTTP_HOST}:%{QUERY_STRING} ^(\w+)\.t(.*)\.(\w+)?\.sprawk\.com:(.*)$
RewriteRule ^(.*) /api/translateHtmlPublic?tl=%1&su=%2&p=$1&q=%4 [B,PT,L]

这对 GET 请求很有用。

但是,对于 POST 请求, q 参数为空(这是我所期望的),但在我的 Java servlet 中,HttpServletRequest.getReader()和都HttpServletRequest.getInputStream()没有提供数据。

使用 Firefox Live 标头,我看到我正在发送:

POST /uid/contactSend.cfm HTTP/1.1
Host: fr.t51940.local.sprawk.com
Connection: keep-alive
Referer: http://fr.t51940.local.sprawk.com/uid/contact.cfm?country=137
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 146
userName=Nic&queryCountry=Libya&queryCode=137&userEmail=n.cottrell%40idea.int&Comment=Just+testing&captcha=Quotas&Submit=--+Envoyer+Commentaire+--

我知道 servlet 正在接收它,POST因为该doPost方法被触发。我知道 Apache 2.x 应该在简单的重写过程中自动保留 POST 数据,但也许添加参数正在擦除内容数据?

更新:我刚刚意识到(通过转储所有参数)userName、queryCountry、queryCode 参数正在通过该request.getParameter(String)方法获得正确的值。问题是我需要能够将原始表单参数名称与我在 RewriteRule 中介绍的名称分开。

4

1 回答 1

1
  1. POST 的参数在正文中,而不是标题中。您可以在不影响它们的情况下尽可能多地重写 URL。

  2. 内容类型为的 POST 请求的主体仅包含通过读取主体通过application/x-www-form-urlencoded检索到的参数,并且不会传递任何内容。(Servlet 规范 3,#3.1.1)request.getParameter().request.getInputStream()request.getReader()

  3. 根据 Servlet Specifcation #3,您添加到 URL 的参数应该可以通过getParameter().

  4. 无法区分正文中的 POST 参数和标头中的 URL 参数。因此,您的解决方案或您的问题可能有问题。

于 2012-12-06T23:28:08.030 回答