2013-10-07 46 views
1

我在尋找一系列的.htaccess聲明,將轉換下列URL的.htaccess - URL重寫那滴擴展並通過論證

http://mysite.com/product   to http://mysite.com/product.php 
http://mysite.com/product/55   to http://mysite.com/product.php?id=55 
http://mysite.com/category/38   to http://mysite.com/category.php?id=38 
http://mysite.com/resources/car/19  to http://mysite.com/resources/car.php?id=19 
http://mysite.com/resources/car/19?color=red&year=2013 to http://mysite.com/resources/car.php?id=19&color=red&year=2013 

換句話說,在我的網站上呈現的PHP文件時,我想要刪除.php擴展名。如果URL以數字結尾,那麼我想通過該查詢字符串參數作爲id。我也想要傳遞所有傳統的查詢字符串參數到我的PHP我的文件,如coloryear

我不知道如何構建這樣的.htaccess文件。

其他注意事項 我目前使用興田以下,但它沒有考慮到以數字蹤跡考慮的網址,並通過沿作爲id

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteCond %{QUERY_STRING} (.*) 
RewriteRule . %{REQUEST_FILENAME}.php?%1 [L] 

如果我能做到像更換在第二行中的REQUEST_FILENAME後面的數字,會很好。

+0

你嘗試過四處搜索嗎?可能是這個幫助! http://stackoverflow.com/questions/16230422/mod-rewrite-to-remove-php-extension-and-preserve-get-parameters –

+0

http://www.addedbytes.com/articles/for-beginners/url -rewriting-for-begin/ – Domecraft

+0

嘿傢伙,我試着四處搜尋,但沒有找到我正在尋找的東西。我更新了我的問題以顯示我當前的重寫規則。 – John

回答

1

首先,您需要確保Multiviews已關閉。那麼你就需要3套重寫規則:

Options -Multiviews 
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)$ /$1.php [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/([0-9]+)$ /$1.php?id=$2 [L,QSA] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^resources/([^/]+)/([0-9]+)$ /resources/$1.php?id=$2 [L,QSA] 

你可以更具體一點,如果網址實際上只是「產品」,「類別」和「車」,那麼你可以有:

Options -Multiviews 
RewriteEngine On 

RewriteRule ^product$ /product.php [L] 

RewriteRule ^(product|category)/([0-9]+)$ /$1.php?id=$2 [L,QSA] 

RewriteRule ^resources/car/([0-9]+)$ /resources/car.php?id=$1 [L,QSA] 

約翰(運)說:

這是最後的.htaccess文件我結束了

RewriteEngine On 
Options -Multiviews 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{QUERY_STRING} (.*) 
RewriteRule ^(.*)\/([0-9]+)$ $1.php?id=$2&%1 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{QUERY_STRING} (.*) 
RewriteRule ^(.*)$ $1.php?%1 [L] 
+0

如果我有http://mysite.com/dir1/dir2/dir3/helloworld這樣的網址需要映射到http://mysite.com/dir1/dir2/dir3/helloworld.php,該怎麼辦?我需要爲它編寫另一套RewriteRule嗎?基本上每次我添加一個新的目錄或子目錄,我需要寫新的規則? – John

+0

@John如果有任意數量的目錄,你可以去掉第三條規則(它的正則表達式是^^resources /([^ /] +)/([0-9] +)$'),然後將另外兩個的正則表達式從'^([^ /] +)'改爲'^(。*)'。 –

+0

偉大的工作。我還需要制定第二套規則,否則我會得到500個內部服務器錯誤。日誌說,它重定向太多次了。 – John