2010-01-23 102 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