重写所有网址

时间:2009-05-21 14:30:18

标签: regex apache mod-rewrite

我想重写一下:

http//www.example.com/index.php?var1=val1&var2=val2&var3=val3

http://www.example.com/var1/val1/var2/val2/var3/val3/

我正在寻找一个解决方案来处理任意数量的变量。可以吗?

2 个答案:

答案 0 :(得分:4)

看看这个问题:Can mod_rewrite convert any number of parameters with any names?

My answer也适用于您的情况:

$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));
for ($i=0, $n=count($segments); $i<$n; $i+=2) {
    $_GET[rawurldecode($segments[$i])] = ($i+1 < $length) ? rawurldecode($segments[$i+1]) : null;
}

相应的规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

此规则将任何无法映射到现有文件或目录的请求重写为index.php

答案 1 :(得分:0)

是。诀窍是写一个RewriteRule用斜杠替换一个字符(等号或和号),然后使用“next”标志重新开始重写过程。

以下可能是一个好的开始:

RewriteRule ^/index.php - [chain]
RewriteRule ^(.*)[=&](.*)$ $1/$2 [next]
RewriteRule ^/index.php\? "/"

如果我做对了,第一条规则什么都不做,但只有路径以“/index.php”开头才匹配。 “链”选项意味着除非第一个规则匹配,否则第二个规则将不会运行。第二条规则将尝试替换=或&amp;使用/,如果成功,它将重新启动整个重写过程。第三条规则,只有在所有=和&amp;之后才能达到已被替换,将删除“/index.php?”在开始。