簡體   English   中英

如何重寫這樣的網址?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM