2013-09-21 47 views
1

最近,我正在嘗試使用PHP的mod_rewrite引擎。我讀過的一些教程給了我一個很好的圖畫,如何使用它最基本和有用的可能性。但是我仍然沒有找到答案。我想這應該是第一個要解釋的問題,但沒有教程給我答案。mod_rewrite在哪裏開始搜索?

我想知道當試圖匹配正則表達式時,URL的很大部分正在被考慮。

比方說,我在我的服務器上有一個目錄my_project,在該目錄中有一個.htaccess文件。瀏覽器應該會看到類似這樣的目錄:

http://my_website.com/my_project 

如果我在.htaccess添加一個規則,然後上面的網址的一部分,將被視爲試圖滿足此規則的正則表達式是什麼時候?我對理解正則表達式本身非常好,但我無法弄清mod_rewrite選擇哪個URL來執行正則表達式。

如果我的問題還不夠清楚,讓我也這樣說吧:上面的URL的哪個確切位置與.htaccess中的以下正則表達式匹配?

^ 

還有一個問題,如果我去

http://my_website.com/my_project/subfolder 

將URL的一部分考慮會有所不同,否則會一直依賴於地方.htaccess放置?

+2

mod_rewrite是一個* Apache *模塊,與PHP無關。 – deceze

+0

@deceze,好點。對我來說,孤立這兩件事總是很困難。 – matewka

回答

2

我想通出來。
爲了解釋這個問題以及我如何得到答案,我會嘗試一步一步解釋它。
假設如下:

.htaccess被放在一個文件夾my_project中的www.my_website.com根路徑。 .htaccess包括以下規則:

RewriteRule ^.*$ index.php?matched=$0 

爲了避免無限循環讓我們的「火」只有在我們提供的查詢字符串測試參數的規則,所以完整的.htaccess應該是這樣的:

RewriteEngine On 
RewriteCond %{QUERY_STRING} test=1 
RewriteRule ^.*$ index.php?matched=$0 

現在,如果一切順利,我認爲我們最終應該在index.php腳本中放置my_project文件夾。要看到整個比賽,讓我們下面的行添加到該腳本:

var_dump($_GET["matched"]); 

在我們去http://my_website.com/my_project?test=1瀏覽器,我們希望可以將輸出爲:

string(32) "http://my_website.com/my_project" 

但它不是!它是

string(0) "" 

我們快到了。現在我們來看看http://my_website.com/my_project/subfolder/?test=1。輸出是

string(10) "subfolder/" 

這證明了一兩件事 - mod_rewrite的時候開始比較正則表達式不會看到URL的一部分PROTOCOL以及在HTTP_HOST部分的URL。正如我進一步的研究顯示,它還會忽略位於.htaccess位置以上的每個文件夾以及URL的查詢字符串和散列部分。對於mod_rewrite,URL始於.htaccess位置開始的位置。

我希望這個自我回答的問題對未來的人會有幫助。

享受!

+1

+1用於解答你自己的問題。我想指出的一件事是,你所得出的信息也是在'RewriteRule'的文檔中提到的,但不是很清楚。同樣,所有'RewriteRule'都忽略URL的模式和主機名,而不僅僅是.htaccess。 –

0

讓我給你一個實際的例子

假設你的網站是www.example.com,它位於一個名爲「EX」 文件夾/目錄你會放置.htaccess文件在你的前文件夾讓它爲您的網站www.example.com

現在的工作讓我們假設你想這個網址乾淨www.example.com/ex/index.php?page=welcome

開放your.htaccess文件你已經放在你的前文件夾中,並將下面的代碼添加到它

RewriteEngine On 
RewriteRule ^([A-Za-z0-9-+_%*?]+)/?$ index.php?page=$1  [L] 

它會從www.example.com/ex/index.php?page=welcome chagle網址www.example.com/ex/welcome

現在讓我們假設你感動你的網站到子文件夾前/子文件夾或www.example.com/ex到www.example.com/ex/subfolder

只需將.htaccess文件與您的所有網站移動到該子文件夾,無需更改它將工作的代碼相同

([A-Za-z0-9 - + _%*?] +)< - 括號內的這部分用作正則表達式 表示您是廁所任何字符從A到Z和從A到Z以及0到9之間的任意數字以及符號 - ,+,_,%,*,?方括號後的+號表示多於一個。

總之你問到的是([這裏] +),它是一個以上的,然而,如果你的支架後刪除+符號,它會返回的第一個字符

+0

我不確定這是我尋找的答案。我明白mod_rewrite是如何工作的。我只是無法確定URL的哪一部分被視爲正則表達式的字符串。 – matewka

+0

([A-Za-z0-9 - + _%*?] +)< - 括號中的這部分用作正則表達式(編輯答案希望現在可以幫到你) – user2801966

+0

我終於想通了自己出來。如果在比較中考慮了整個URL,那麼你的正則表達式就不會匹配那個URL,因爲這個URL由例如一個**點**標誌。現在我知道只有URL的一部分被正則表達式比較,並且它是'.htaccess'放置的路徑。這意味着協議和http_host是ommited。同樣優先考慮'.htaccess'的文件夾。我希望你瞭解我的觀點。 – matewka