2012-03-11 94 views
0

我需要專家的幫助。Url Mod-Rewrite用ID獲取新頁面

我有一些重寫規則:

post.php go to http://example.com/post/3/ 
RewriteRule ^post/([A-Za-z0-9-]+)/?$ post.php?id=$1 [NC,L] 

它的作品!

但是,我怎麼可以添加新的重寫規則到新頁面Users.php後/ ID/ 後在Users.php獲得ID(Users.php?ID = 3)

篩選http://example.com/post/3/users

謝謝!

+0

所以'/ post/3 /'必須轉到'/post.php?id=3'。這樣可行。但'/ post/3/users /'也應該轉到'/Users.php?id = 3'? – Kaz 2012-03-11 22:14:30

回答

3

如果您想要/post/3/users/轉到/Users.php?id=3,您必須將該規則放在現有規則之前。您現有的規則匹配/post/3/',該規則是此附加規則匹配內容的前綴,因此如果該規則在之後,則該規則永遠不會觸發。

# catch the longer URL first 
RewriteRule ^post/([A-Za-z0-9-]+)/users/?$ Users.php?id=$1 [NC,L] 

# No /users/ on it; rewrite to post.php 
RewriteRule ^post/([A-Za-z0-9-]+)/?$ post.php?id=$1 [NC,L] 

另一件事:你用.htaccess標記你的文章。這是否意味着您的重寫是在.htaccess?如果是這樣,你應該使用RewriteBase,因爲你的重寫是相對的。爲什麼它的工作原理可能是你允許web服務器上的路徑和URL之間的1:1對應。

在像.htaccess這樣的按目錄的上下文中,mod_rewrite正在處理路徑名稱,而不是URL。但是如果你做了一次相對重寫,路徑就會變成一個URL並且反饋到Apache的請求處理鏈中再次處理。如何將路徑轉換爲URL是將RewriteBase的內容添加到前面。如果你沒有RewriteBase,那麼會發生一件愚蠢的事情:你的目錄的路徑(RewriteRule已被刪除!)。

示例:假設您的DocumentRoot爲/var/www。假設瀏覽器請求URL /foo。它只是需要/var/www/目錄剝離下來並把它放回:此獲取如果.htaccess/var/www/裏面你重寫foobar(和RewriteBase未設置),則說明mod_rewrite將生成URL /var/www/bar轉換爲路徑/var/www/foo。現在可以開始工作了:只需使/var/www/有效的URL到達該目錄即可。例如與

Alias /var/www /var/www # map /var/www URL to /var/www directory 

但這是hacky。正確的方法是在.htaccess中有RewriteBase /。所以當foo被改寫爲bar時,它只是在前面得到/並且變成了url /bar。這被反饋給服務器,並且將「自然地」重新解析迴文檔根目錄。

在我瞭解重寫之前,我使用了這樣的黑客。我甚至使用/作爲DocumentRoot!這使得所有東西都可以正常工作,因爲大多數URL都是路徑:您不必將URL看作是與文件系統路徑分開的抽象。但這是一件危險而愚蠢的事情。

+0

工程就像一個魅力!謝謝! – Mark 2012-03-11 22:26:42