我正在開發一個使用PHP和Apache的網站。 我想談談我的網址,這些網址如何將動態網址變爲靜態網址
www.example.com/book.php?book=title
弄成這個樣子,如果有可能,當然:
www.example .com/book/title
請注意,書的標題是獨特的,不能重複。
我已經閱讀了這篇文章,但沒有一篇對我這樣的初學者來說足夠清晰。 你們知道任何解釋的教程嗎?
謝謝。
我正在開發一個使用PHP和Apache的網站。 我想談談我的網址,這些網址如何將動態網址變爲靜態網址
www.example.com/book.php?book=title
弄成這個樣子,如果有可能,當然:
www.example .com/book/title
請注意,書的標題是獨特的,不能重複。
我已經閱讀了這篇文章,但沒有一篇對我這樣的初學者來說足夠清晰。 你們知道任何解釋的教程嗎?
謝謝。
擴展@ Rodolphe's和@ Galen的回覆一點點。
如果您對url重寫的需求有限,使用Rodolphe示例中描述的規則的硬編碼.htaccess
將會很好地完成。然而,正如Galen所說,你的需求可能是未知的,或者你可能想在以後擴展它們,而不需要觸及你的重寫規則,一旦你有他們的工作。
一個常見的做法是圍繞一個URL方案設計你的應用程序,這個URL方案是www.host.com/controller/action/parameter
。這種URL的一個例子可以是www.host.com/book/view/1
,然後可以通過多種方式在內部進行處理。
1)
您對每個控制器都有單獨的腳本。然後,您將每個請求重寫爲$controller.php?action=$action¶m=$param
,將不匹配或無效的請求重定向到默認控制器。
# Serve files and directories as per usual,
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
# If the request uri doesn't end in .php
# and isn't empty, rewrite the url
RewriteCond %{REQUEST_URI} !.php$
RewriteCond %{REQUEST_URI} !^$
# Try matching against a param request first
RewriteRule (.*?)/(.*?)/(.*?) $1.php?action=$2¶m=$3 [L]
# If it didn't match, try to match an action
RewriteRule (.*?)/(.*?) $1.php?action=$2 [L]
# redirect all other requests to index.php,
# your default controller
RewriteRule .* index.php [L]
2)
你有一個單一入口點(或前端控制器)到您重定向每一個請求,而這個前端控制器處理重定向請求到合適的控制器。
# Redirect all requests that isn't a file or
# directory to your front controller
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteRule .* index.php [L]
通用回退規則不會將任何參數追加到默認/前端控制器。但是,由於它是內部重定向,因此您將有權訪問PHP中的REQUEST_URI
以確定您應該執行的操作。
這些當然不是您唯一的選擇。只是我的2美分在湯中攪拌更多一點。
免責聲明: 所有上述重寫規則(以及其他所有內容,當然)直接寫在我的頭頂(幾個啤酒之後),並沒有經過任何測試。
你正在尋找的功能被稱爲「URL重寫」
您可以手動做到這一點:你使用正則表達式解釋模式,與網絡服務器轉換它通常下找到請求 與Apache。的.htaccess文件,或在httpd.conf directyl 看到官方文檔在這裏:http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
它不「即」易於安裝,雖然,特別是調試正則表達式
關於您的問題,嘗試像一個規則。這個:
RewriteEngine on
RewriteRule ^book/(.*)$ book.php?book=$1 [L]
另一種選擇是使用php框架:大多數情況下,這個功能是內置的。 你必須「學習」如何使用框架。如果您的網站已經完成了,這是不是最好的選擇...
這裏是Kohana的方式(和PHP框架的99.99%),難道
添加一個.htaccess文件(如果使用Apache)
# Turn on URL rewriting
RewriteEngine On
RewriteBase/
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT,L]
這會將所有網址重定向到index.php。 index.php爲某種前端控制器的加載根據網址
因此,在您的示例腳本:
本地主機/書/標題
的index.php會被加載。它會進入網址並獲得頁面(控制器)加載,實際上將完成所有工作。在這種情況下可能是books.php。 books.php會從網址中獲得圖書的標題,然後搜索數據庫或做任何有關該名稱的內容。
大多數解決方案依賴於mod_rewrite。例如See here。
我在靜態格式中創建了一個內部鏈接,例如我的網頁中的「http://www.example.com/casestudy/34」。
而且我已經寫在.htaccess文件中下面的代碼:
Options +FollowSymLinks
RewriteEngine On
RewriteBase/
RewriteRule ^casestudy/([^-]+) /casestudy_details.php?id=$1 [R=301,QSA,L]