2009-05-21 104 views
3

我想改写这样的:重写所有的网址

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

进入

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

我正在寻找一个解决方案,对变量的任意数量的工作。可以做到吗?

+0

正如你接受我的回答,我认为你应该编辑你的问题,并更改网址。因为我的解决方案将第二种形式的请求内部重写为第一种形式。 – Gumbo 2009-05-21 14:54:10

回答

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

+0

这与要求的相反。它将“/ a/b/c/d”变成“/index.php?a=b&c=d”。提问将“/index.php?a=b&c=d”转换为“/ a/b/c/d”。 – Glomek 2009-05-21 14:54:53

0

是的。诀窍是编写一个RewriteRule,用斜线替换一个字符(等号或和号),然后使用“下一个”标志重新启动重写过程。

下面可能是一个良好的开端:

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

如果我得到这个权利,第一条规则将做什么,但前提是路径与“的index.php”开始匹配。 “链”选项意味着除非第一条规则匹配,否则第二条规则将不会运行。第二条规则会尝试用/替换=或&,如果成功,它将重新启动整个重写过程。第三条规则只有在所有的=和&被替换后才会达到,将删除“/index.php?”在开始时。