2012-12-06 24 views
1

我有這樣一個規律:我可以重寫URL,添加查詢參數並保存表單數據嗎?

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活頭,我看到,我送:

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中引入的名稱分開。

回答

1
  1. POST的參數在主體中,而不是頭部。您可以儘可能多地重寫URL,而不會影響它們。

  2. POST請求其內容類型是application/x-www-form-urlencoded僅由是經由request.getParameter().檢索經由request.getInputStream()request.getReader()讀體將提供什麼參數的主體。 (Servlet規範3,#3.1.1)

  3. 根據Servlet規範#3,添加到URL的參數應該可以通過getParameter()獲取。

  4. 無法區分標題中的URL參數中的POST參數。因此,您的解決方案或您的問題可能有問題。

+0

感謝您的詳細信息。我的備份計劃是爲我的變量引入一個長前綴,以便與現有名稱衝突的可能性非常低。我希望有一種方式告訴servlet /不/自動處理主體,並通過'getParameter'使數據可用。 –

相關問題