2012-07-23 74 views
0

我從IIS世界來到Apache,希望對重寫規則有所幫助。Apache重寫規則 - 路徑樣式

我想這個相對路徑:

/index.php?go=order&id=12345 

被改寫爲:

/go/order/id/12345 

另外,如果有更多的參數,它們應該被轉換成路徑格式:

/index.php?go=order&id=12345&action=process 

變成

/go/order/id/12345/action/process 

我該如何做到這一點?感謝您的任何意見。

回答

1

嘗試把這個在你的虛擬主機配置:

RewriteEngine On 

# Start converting query parameters to path 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\?[^\ ]+ 
RewriteCond %{QUERY_STRING} ^([^=]+)=([^&]+)&?(.*)$ 
RewriteRule ^(.*)$ $1/%1/%2?%3 [L] 

# done converting, remove index.php and redirect browser 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\?[^\ ]+ 
RewriteCond %{QUERY_STRING} ^$ 
RewriteRule ^/index.php/(.*)$ /$1 [R=301,L] 

# internally rewrite paths to query strings 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !^/index\.php 
RewriteRule ^/([^/]+)/([^/]+)/?(.*) /$3?$1=$2 [L,QSA] 

# No more path, rewrite to index.php 
RewriteRule ^/$ /index.php [L] 

這些規則將使它所以如果你像在瀏覽器中​​一個URL類型,瀏覽器將重定向到http://yourdomain.com/a/b/1/2/z/x。當請求乾淨的URL時,第二組規則在內部重寫爲/index.php?a=b&1=2&z=x。如果你想把這些規則放在一個htaccess文件中(在你的文檔根目錄下),你需要刪除RewriteRule中的所有前導斜線。所以^/需要在最後3條規則中爲^

請注意,如果您只是轉到http://yourdomain.com/index.php,而沒有查詢字符串,則不會重寫任何內容。

+0

太棒了!現在我們如何檢查給定的路徑是不是現有的目錄或文件?靜態資源未被加載。 – Nirmal 2012-07-29 08:04:22

+0

@Nirmal請參閱編輯,需要有'!-f'和'!-d'檢查 – 2012-07-29 08:07:35

+0

感謝Jon!你今天教給我一些新東西! :) – Nirmal 2012-07-29 08:22:15