2013-08-28 123 views
1

在我的應用程序要實現URL重寫,以使鏈接搜索引擎友好URL重寫mod_rewrite的問題

1.http://example.com/item.php?act=view&id=192 
2.http://example.com/feedback.php?id=146 

TO

1.http://example.com/items/itemsname 
2.http://www.example.com/username 

問題

1)我有點糊塗了,雖然,是否需要將我的代碼中的所有鏈接更改爲http://example.com/items/itemsname並使用重寫將其轉換爲http://example.com/item.php?act=view&id=192

我可以離開我的代碼,因爲它是http://example.com/item.php?act=view&id=192,只是重寫它轉化爲http://example.com/items/itemsname(選項2看起來否則更現實沒有的.htaccess任何方法都行不通)

2)如何這在Apache和Php中完成?

回答

1

你有幾個方法可以做到這一點,我會說,你當前的PHP的最簡單的方法是改變你的鏈接是這樣的:

http://example.com/items/id-itemsname 
http://example.com/id-username 

因此,一個真實的例子是這樣的:

http://example.com/items/192-Wash-Machine 
http://example.com/feedback/146-Jon-Lin 

然後你就可以很容易地使用這個規則把它轉換:

Options +FollowSymLinks -MultiViews 

RewriteEngine On 
RewriteBase/

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

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

通過這種方式,您可以完全忽略標題並僅從其中獲取標識並使用當前腳本,同時仍向用戶顯示標題。

另一種方式是像你提到的,它應該是這樣的:

http://example.com/items/itemsname 
http://example.com/feedback/username 

你會那麼需要改變你的PHP按名稱查找反饋和物品,使他們看起來像這樣:

http://example.com/item.php?act=view&name=Wash Machine 
http://example.com/feedback.php?username=Jon Lin 

而且規則是這樣的:

Options +FollowSymLinks -MultiViews 

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^items/([^/]+)/?$ /item.php?act=view&name=$1 [L] 

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

的RewriteCond需要在電子是重寫規則我想每個條件的最後,非常感謝您的詳細回答! – Athanatos

+0

@Athanatos這是我的壞,這是一個錯字,感謝您發現;) – Prix

0

這將幫助你:URL Rewrites and 301 Redirects - How Does It All Work?

就個人而言,我認爲正確的做法是改變所有的鏈接,並使用.htaccess文件來重寫這些URL(很明顯,你需要將好的名稱轉換[又名蛞蝓]改寫成id後)。我儘量避免重定向,除非它們是100%必要的,事實並非如此。事情是這樣的:

的.htaccess:

RewriteRule ^items/([0-9a-zA-Z\-\_].*)$ item.php?act=view&slug=$1 [L] 

關於鏈接,你可以改變自己手動(我建議),或通過JavaScript,從而使某種用戶點擊後轉換的功能。

1

我有點糊塗了,雖然,我需要在我的代碼的所有鏈接更改爲http://example.com/items/itemsname和使用重寫翻譯成http://example.com/item.php?act=view&id=192

你想這樣做,如果你可以的話。這意味着你沒有另外一層處理的每個鏈接被點擊

翻譯有點含糊不清。例如:

/username - >/feedback.php?id=146

的 「用戶名」 我想大概是 「山姆」,但 「ID」 是一個數字。重寫模塊知道什麼都沒有關於這個映射,在htaccess文件中什麼都不知道用戶名如何映射到ID或項目名稱如何映射到ID。唯一可以做的是使用在訪問此映射的server/vhost配置中定義的RewriteMap

你最好做的就是使用php。將項目和用戶名映射到item.phpfeedback.php腳本。讓這些腳本根據名字找出id。 有這些腳本檢查請求的URI,看看請求是否是直接的PHP文件,而不是SEO尋找的URL,並讓他們根據需要重定向。

你想mod_rewrite的做的唯一的事情就是做正向映射:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond ^item/(.*)$ /item.php?act=view&name=$1 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond ^(.*)$ /feedback.php?name=$1 [L] 

在這裏,你會找到「name」參數,映射那些編號的,您需要,然後繼續正常。