2010-06-27 212 views

回答

7

重寫規則的部分細分如下:

  1. 重寫規則
    表示此線路將是一個重寫規則,而不是重寫條件或其它重寫發動機指令之一

  2. ^(。*)$
    匹配從beggining ^所有字符(.*)於該請求的結束$

  3. /index.php/$1
    該請求將被重寫,其中(.*)在前面的示例中被替換爲$1

  4. [L]
    這就告訴mod_rewrite的,如果在步驟2中的比賽模式,適用此規則爲「最後」的規則,也不再適用。

mod_rewrite documentation真的全面,但無可否認很多涉水通過解碼這樣一個簡單的例子。

最終結果是,所有請求都將通過index.php進行路由,這是在PHP的許多模型視圖控制器實現中看到的一種模式。 index.php可以檢查請求的URL段(以及可能的請求是通過GET還是POST進行的),並使用該信息動態調用某個腳本,而腳本的位置不必與請求URI所隱含的目錄結構相匹配。

例如,/users/john/files/index可能會調用存儲在腳本目錄中的名爲user_files.php的文件中的功能index('john')。如果沒有mod_rewrite,更傳統的URL可能會使用可讀性較低的查詢字符串,並直接調用該文件:/user_files.php?action=index&user=john

4

這將導致每個請求由index.php的處理,其中可以提取從$ _SERVER [「REQUEST_URI」]

所以,對於/富/棒的請求將被重寫的實際請求作爲/index.php/foo/bar

0

(我在這裏發表評論,因爲我還沒有對代表的評論答案)在meagar的回答

點#2似乎並不完全正確我。我可能會在這裏出現一個肢體(我一直在尋找幫助,我的.htaccess重寫......),我很樂意澄清,但這是來自RewriteRule上的Apache 2.2 documentation

什麼是匹配?

該模式最初將與主機名和端口之後以及查詢字符串之前的URL部分進行匹配。如果您希望與主機名,端口或查詢字符串匹配,請分別將RewriteCond與%{HTTP_HOST},%{SERVER_PORT}或%{QUERY_STRING}變量一起使用。

對我來說,似乎是說,對於

的URL http:// some.host.com/~user/folder/index.php?param=value

將實際被匹配的部分是

〜用戶/文件夾/ index.php的

因此,這不匹配「從請求的開始^到結束$」的所有字符(。*),除非「請求」並不意味着我認爲它的作用。

+0

是的,沒錯。 (也許這應該是它自己的問題?) – 2010-06-28 23:16:33

+0

Apache將'%{REQUEST_URI}'變量定義爲(使用你的例子)'/〜user/folder/index.php'(儘管由於我不會進入的原因,爲'RewriteRule'評估刪除第一個'/')。所以我認爲它與整個「請求」是一致的。我之前的評論沒有意識到你的'REQUEST_URI'與Apache定義它的值不同步,抱歉。 – 2010-06-29 05:00:17

+0

對不起,我的錯。我將從評論中編輯它。我猜我學到了什麼,並想與其他新手分享,除非你在RewriteCond中做了一些具體的事情,但實際上到達你的RewriteRule的內容不包括域和任何查詢參數。 – thoni56 2010-06-29 22:06:51