2010-04-22 110 views
5

我正在開發一個使用PHP和Apache的網站。 我想談談我的網址,這些網址如何將動態網址變爲靜態網址

www.example.com/book.php?book=title

弄成這個樣子,如果有可能,當然:

www.example .com/book/title

請注意,書的標題是獨特的,不能重複。

我已經閱讀了這篇文章,但沒有一篇對我這樣的初學者來說足夠清晰。 你們知道任何解釋的教程嗎?

謝謝。

回答

0

擴展@ 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&param=$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&param=$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美分在湯中攪拌更多一點。

免責聲明: 所有上述重寫規則(以及其他所有內容,當然)直接寫在我的頭頂(幾個啤酒之後),並沒有經過任何測試。

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框架:大多數情況下,這個功能是內置的。 你必須「學習」如何使用框架。如果您的網站已經完成了,這是不是最好的選擇...

2

這裏是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會從網址中獲得圖書的標題,然後搜索數據庫或做任何有關該名稱的內容。

3

我在靜態格式中創建了一個內部鏈接,例如我的網頁中的「http://www.example.com/casestudy/34」。

而且我已經寫在.htaccess文件中下面的代碼:

Options +FollowSymLinks 
RewriteEngine On 
RewriteBase/

RewriteRule ^casestudy/([^-]+) /casestudy_details.php?id=$1 [R=301,QSA,L]