2014-09-26 72 views
1

我需要幫助重寫URL,因爲我需要所有的查詢字符串值拼接與+號和更換串接一個參數=簽署:查詢字符串更換所有符號字符

所以這樣

鏈接
http://domain.com/mypage?p1=v1&p2=v2&p3=v3 

將成爲

http://domain.com/mypage?params=p1:v1+p2:v2+p3:v3 

(編輯:我改變頁面名稱,刪除.PHP)

+0

這是可能的,但用PHP做它會更有效率。你爲什麼要使用htaccess和'mod_rewrite'呢? – 2014-09-27 10:49:42

+0

頁面實際上並不在PHP中,我使用這個名稱作爲示例。我需要使用一個我無法改變的庫。 – 2014-09-27 16:24:12

+0

p1,p2,p3是否固定(ala是否總是這樣命名)?它們都是必需的嗎? – Sumurai8 2014-09-27 16:56:07

回答

0

由於查詢字符串不會有固定的number/name參數,我決定編寫一個CGI腳本來完成轉換,然後重定向到修改後的url。

非常感謝您的幫助。

0

首先,這個問題不是通過mod_rewrite最好解決的。如果可以的話,你應該修改接收端(你不能)或修改發送端(你可能會發送正確的數據)。如果您碰巧知道可能出現在url中的所有參數名稱,則可以使用this question代替。

您可以將查詢字符串與RewriteCond中的%{QUERY_STRING}變量進行匹配。然後您使用該查詢字符串在內部重新編寫一個網址。

RewriteEngine on 

RewriteCond %{QUERY_STRING} !params= 
RewriteRule ^sillyframework/sillypage$ sillyframework/sillypage?%{QUERY_STRING}&params= 

RewriteCond %{QUERY_STRING} ^([^&=]+)=([^&]+)&params=([^&=]*)$ 
RewriteRule ^sillyframework/sillypage$ sillyframework/sillypage?params=%3+%1:%2 [L] 

RewriteCond %{QUERY_STRING} ^([^&=]+)=([^&]+)&(.*)&params=([^&=]*)$ 
RewriteRule ^sillyframework/sillypage$ sillyframework/sillypage?%3&params=%4+%1:%2 [L] 

有一個問題這種方法,那它需要多個內部遞歸的在查詢字符串的所有參數翻譯。爲什麼這不好?每次遞歸都需要花費時間。爲了保護服務器,允許的默認遞歸量爲10,之後您將得到內部服務器錯誤。可以通過增加限制或使用[N]標誌來繞過此遞歸限制。 [N]標誌是一個非常糟糕的主意,就像遞歸極限的嚴重選擇限制一樣。 Apache不會以N標記不正確的規則終止,所以對於使用它的規則的特製請求可以讓mod_rewrite做你自己的服務器。 InternalRecursionLimit的嚴重選擇(高值)基本上是一樣的。服務器不會顯示內部服務器錯誤,而會在服務器達到該限制之前炸掉服務器。 N標誌與限制之間的差異在於理論上InternalRecursionLimitL的高值將最終達到該限制,其中N不會這樣做。

+0

請注意,我還沒有測試過這些規則,因爲我沒有從這個領域訪問Apache服務器。如果我沒有完全搞砸它應該可以工作。如果不起作用,請嘗試添加'DPI'標誌。如果它仍然行不通,責怪別人,而不是我。另外:框架並不一定需要愚蠢才能發揮作用。獨角獸可能會或可能不會包含在此解決方案中。 – Sumurai8 2014-09-27 17:29:40