2009-05-21 96 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?」在開始時。