[英]How to rewrite urls like this?
我將如何重寫(對於博客中的每個帖子):
http://localhost/post.php?id=13
to
http://localhost/this-is-the-title-of-the-post/13
AND(無id)
http://localhost/post.php?id=13
to
http://localhost/this-is-the-title-of-the-post/
嘗試以下規則:
RewriteEngine on
RewriteRule ^[^/]+/(\d+)$ post.php?id=$1
這會將請求的URI路徑(如/this-is-the-title-of-the-post/13
內部/post.php?id=13
為/post.php?id=13
; 所以這與您描述的相反。 但這就是mod_rewrite的工作方式:您只能更改傳入的請求,而不能更改傳出的響應。
現在,如果您想省略數字ID,則標題必須是新的ID:
RewriteRule ^this-is-the-title-of-the-post/(13)?$ post.php?id=13
這意味着它必須是唯一的。 否則,標題不能明確地映射到數字ID。 在這種情況下,如果將標題傳遞給post.php,肯定會更容易:
RewriteCond %{REQUEST_FILENAEM} !-f
RewriteRule ^([^/]+)/$ post.php?title=$1
顯然,由於標題是唯一的,因此您不再需要數字ID。
mod_rewrite是一個Apache模塊,允許您使用正則表達式執行此操作。 如果您使用的是Windows / IIS Web服務器,則將擁有完全不同的技術。 我只是堅持使用Apache。
您的第一個示例非常簡單,因為重寫的URL只需要在正確的位置包含ID即可起作用。 先前的答案已經給出了可行的解決方案。
第二個示例(即,重寫的URL中沒有ID)將需要您修改基礎的PHP,以查詢數據庫以查找頁面標題而不是ID(這可能會對您的網站產生性能影響,具體取決於您的操作方式)寫下來)。 或者,您可以為每個單獨的URL設置一個特定的重寫規則,但這是維護的相當大的開銷。
使用mod_rewrite的壞消息是,要使其正常工作可能是一項艱巨的任務,特別是如果您對正則表達式不滿意的話。 問題是,如果它不起作用,您只會在瀏覽器中收到服務器配置錯誤,並且調試起來非常困難。 如果您願意堅持不懈,那是值得的,但是對於初學者來說,這可能會令人沮喪。
好消息是,如果您使用的是CMS產品(如Wordpress或Drupal),則這些產品都內置了URL重寫功能,因此您完全不需要弄亂服務器配置。
希望能有所幫助。
如果只想使用純文本的URL(URL中沒有pk引用),則必須在數據庫中實現唯一的SLUG字段(日期可以是唯一的,就像wordpress一樣)。
我建議將所有與現有文件不匹配的請求重定向到index.php並處理$ _SERVER ['REQUEST_URI']並避免處理mod_rewrite magick(長期使用會導致不可維護和magick代碼)。 對此的mod_rewrite規則
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.