2010-01-23 99 views
0

我正在嘗試使用mod_rewrite處理未知數量的變量。具有未知數量變量的mod_rewrite

一個例子網址是:

example.com/var1-var2-var3/title

我有這個至今:

RewriteRule ^([^/.]+)-([^/]*)(.*)$ $3?version[]=$1&version[]=$2 [QSA,N] 
RewriteRule ^([^/.]+)/?$ ?title=$1 [QSA,N] 
RewriteRule ^/?$ /index.php [QSA,L] 

這將返回: 陣列([標題] => title [version] => Array([0] => var1-var2 [1] => var3))

我需要它返回:Array([title] => title [version] => Array([0] => var1 [1] => var2 [2] => va r3))

回答

3

我不認爲你可以在一個RewriteRule正則表達式中捕獲任意數量的參數。難道不是更容易重定向到index.php?version=var-var2-var3然後在PHP做一個explode()$_POST['version']

編輯:您可以爲有限數量的變量(9是我相信的最大捕獲的子組),然後刪除多餘的空條目。梅西耶那麼簡單的爆炸()替代在我看來,但在這裏你去:

# Convert up to 8 arguments. 
RewriteRule ^/([^-]+)-(?:([^-]+)-)?(?:([^-]+)-)?(?:([^-]+)-)?(?:([^-]+)-)?(?:([^-]+)-)?(?:([^-]+)-)?(?:([^-]+)-)?/(.*)$ index.php?t=$9&v[]=$1&v[]=$2&v[]=$3&v[]=$4&v[]=$5&v[]=$6&v[]=$7&v[]=$8 
# Strip empty ones. 
RewriteRule [?&]v\[\]=$ "" [N] 

你也可以做一個複雜的循環由一個變種移動到新的格式上重寫引擎的每次運行,並繼續運行它直到你用盡瓦爾,但我認爲這不僅僅是一個URL重寫引擎應該負責的。

編輯2:好吧,這裏是我提到的循環:

RewriteEngine on 
RewriteRule ^(.*)/([^/]+)$ $1&page=$2 [L] 
RewriteRule ^([^-]+)-(.*)?$ $2&v[]=$1 [L] 
RewriteRule ^(?!index\.php)([^-]+)$ /index.php?v[]=$1 [L] 

它變換的樣本網址如下:

var1-var2-var3/title        <-- Original 
var1-var2-var3&page=title 
var2-var3&page=title&v[]=var1 
var3&page=title&v[]=var1&v[]=var2 
index.php?v[]=var3&page=title&v[]=var1&v[]=var2 <-- Final 
+0

這可能是一個解決方案,但在重寫規則處理它會更簡單。 – Daniel 2010-01-23 04:01:51

+0

我正在尋找更多的東西,沿着這個http://howflow.com/tricks/apache2_mod_rewrite_google_friendly_urls 行的東西除了用' - '而不是'/'分隔所有的變量。 – Daniel 2010-01-23 04:50:13

+0

在那個頁面上描述的內容恰恰就是「在每次運行時將一個var移動到新格式的複雜循環」,我提到過。我將在適用於您的格式的版本中進行編輯。 – 2010-01-23 04:59:51