2012-08-24 56 views
3

我有一些項目,我重定向index.php,與各種GET參數的每個請求。Htaccess:多個參數和嵌套括號

目前,我使用這種htaccess的(這是唯一的提取物,和我改變參數名a, b, c...,爲了簡化問題):

RewriteRule ^([\w-]+)\.html$     index.php?a=$1 [L] 
RewriteRule ^([\w-]+)/([\w-]+)\.html$   index.php?a=$1&b=$2 [L] 
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)\.html$ index.php?a=$1&b=$2&c=$3 [L] 
(...) 

它的工作原理(井),但我正在考慮一種將這些線條縮小爲單一線條的方法。 這個想法是有一些嵌套括號'生成'所有GET參數,但它似乎不會像我想象的那麼容易。

這是我到目前爲止已經做出:

RewriteRule 
    ^(?:([\w-]+)\/)*([\w-]+)\.html$ 
    index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 [L] 

GET結果的URL http://website.com/1/2/3/4/5/6/7/8/9.html

array(9) { 
    ["a"]=> string(1) "8" 
    ["b"]=> string(1) "9" 
    ["c"]=> string(0) "" 
    ["d"]=> string(0) "" 
    ["e"]=> string(0) "" 
    ["f"]=> string(0) "" 
    ["g"]=> string(0) "" 
    ["h"]=> string(0) "" 
    ["i"]=> string(0) "" 
} 

而不是得到a=1b=2c=3 ...我只收到兩個最後的參數。注意RewriteRule被執行,然後我知道我的正則表達式匹配。

有什麼想法?

+0

你試圖解決什麼是真正的問題?使用正則表達式並不總是最好的解決方案。 – Arjan

+0

我把它放在粗體中:使用一個RewriteRule而不是9來完成相同的工作。在這種情況下,我並不在乎表演,這更多的是好奇心的問題。 – zessx

+0

所以基本上你想知道是否有可能編寫一個正則表達式來將url轉換成具有大量GET參數的東西。這應該是可能的,但這也意味着您將刪除原始url上指定的任何GET參數。這意味着它不適合任何項目。 – Arjan

回答

1
RewriteRule 
    ^([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+))?)?)?)?)?)?)?)?\.html$ 
    index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 [L] 

未經測試,但我認爲這是做你想做的。請注意,它適用於1到9個參數,它至少需要一個參數。 另請注意,原始網址中存在的任何GET參數均可通過此方式移除。

+0

正如@Sat所說,這個解決方案是醜陋的:)無論如何,這是一個工作單線解決方案,所以你得到了我的投票。謝謝你們的解釋。 – zessx

+0

謝謝。解決方案很難看,這就是爲什麼我首先想知道它確實是你想要的。 – Arjan

3

備案:請考慮使用基於PHP的方法:將整個請求的URI傳遞給PHP,然後您可以使用PHP處理整個事情,這樣做更容易,更安全,甚至可能更安全比用mod_rewrite做法更快。

我的意思是這樣的:

RewriteRule ^(.*)\.html$ switchboard.php?uri=$1 [L] 

然後在switchboard.php:

list($_GET['a'], $_GET['b'], $_GET['c']) = explode('/', $_GET['uri']); 
require 'index.php'; 

(如果超長名單()看起來麻煩,你可以使用一些巧妙的單行映射技術)

無論如何,正則表達式的問題當然是有趣的,但它是一個普通的PCRE的東西。這個現象被稱爲「重複捕獲組」:無論何時你重複使用Kleene星形的捕獲組,實際上只捕獲最後一次迭代(在我們的例子中,匹配1,2..7被丟棄,並且只有8個被保留) - 想象它是一個緩衝區,你用新的和新的匹配來覆蓋。如果你仔細想想,這很有意義。

一個解決方案就是使用盡可能多的組來實現您想要捕獲的組,這是通過使前面的組成爲可選的 - 這對於編寫和讀取來說是非常尷尬的(事實上,Arjan剛剛發佈了它,並且只是爲了看它而頭疼),在這種情況下效率也很低。一個更簡單的解決方案就是捕捉整個事物並將其拆分。

+0

有趣......感謝您在我的問題上寫上一個名字,我找到了一篇詳細介紹它的文章:http://www.regular-expressions.info/captureall.html而且,沒有捕獲每個組的可能性,寫一個單線規則變得尷尬! – zessx

+0

+1,用於清潔和易於維護的解決方案。 – Arjan