如果您想要/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/
裏面你重寫foo
到bar
(和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看作是與文件系統路徑分開的抽象。但這是一件危險而愚蠢的事情。
來源
2012-03-11 22:16:21
Kaz
所以'/ post/3 /'必須轉到'/post.php?id=3'。這樣可行。但'/ post/3/users /'也應該轉到'/Users.php?id = 3'? – Kaz 2012-03-11 22:14:30