2015-02-04 61 views
1

有人可以解釋下面的mod_rewrite腳本是如何工作的? 目標是捕獲對probe.com的訪問權限,該權限沒有任何關注,並將其重定向到probewebsites.com。如果訪問probe.com/anything(如probe.com/register.php),則訪問將保留在probe.com中,在此情況下,將訪問probe.com/register.php。試圖瞭解mod_rewrite腳本

該腳本的作品,我只是不知道如何。

我看到第2行尋找對probe.com的訪問。 然後,第3行以某種方式驗證probe.com後沒有任何內容。 第4行看起來像是收集反向引用,但從未使用過。 感謝您的幫助。

1. RewriteEngine on 
2. RewriteCond %{HTTP_HOST} probe\.com [NC] 
3. RewriteCond %{REQUEST_URI} ^/$ 
4. Rewriterule ^(.*)$ http://probewebsites.com/ [L,R=301] 

回答

2

您對規則的一般理解是正確的。讓我詳細說明一下。

RewriteEngine on 

打開這個目錄的mod-rewrite規則處理。

RewriteCond %{HTTP_HOST} probe.com [NC] 

看起來像是在尋找probe.com,但事實並非如此。由於它是一個正則表達式,因此.可以匹配任何字符。所以,probeXcom也會通過;並且由於沒有指定正則表達式邊界(^$),所以它變成了子字符串匹配。這意味着csi.probe.comprobe.com.uk也將匹配。正確的圖案匹配僅probe.comwww.probe.com將是

RewriteCond %{HTTP_HOST} ^(www\.)?probe\.com$ [NC] 

^$匹配在其上用相同的名稱指的是HTTP報頭中的%{HTTP_HOST}的開始和結束邊界。 \.轉義正則表達式的匹配任何字符.,並立即開始匹配字面點.字符。 (www\.)?中的問號使得捕獲的www.可選。最後,[NC]代表,無例,並使測試不區分大小寫。

RewriteCond %{REQUEST_URI} ^/$ 

這種狀況實際上沒有必要的,因爲你可以在RewriteRule本身相同的比賽。因此,新的規則應該像

RewriteRule ^$ http://probewebsites.com/ [R=301,L] 

注意,這不是^/$,它不是一個錯字。 RewriteRule模式與目錄路徑匹配,但不包括與%{REQUEST_URI}中相同的前導/

[L]將規則標記爲上一個因爲我們無論如何都會重定向[R=301]。狀態碼301向瀏覽器指示此重定向是永久的,因此瀏覽器將緩存它。如果你只指定[R],服務器會做一個302暫時移動重定向。

所以,你的最後。htacces應該像

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^(www\.)?probe\.com$ [NC] 
RewriteRule ^$ http://probewebsites.com/ [R=301,L] 
+0

快速的問題,在這條線'的RewriteCond%{HTTP_HOST} ^(WWW \。)?探頭\ .COM $ [NC]'你不使用EXP'(WWW \。)'作爲反向引用,'()'的目的就是爲了將'www \ .'分組,以便'?'適用於'www \ .'分段?另外,是否有一種方法可以在不使用'()'的情況下對'www \ .'進行分組,即,如果您明確不希望該分段被選爲背景參考? –

+0

好問題。是的,它的目的是對字符序列進行分組,以便後面的'?'使它成爲可選項,但是作爲副作用,它也可以作爲後向參考。如果您不想將其作爲反向引用選取,請以「(?:www \。)?'開始組。開頭的'?:'字符序列現在使它成爲一個未被引用的組。 –

+0

感謝您的解釋。但是,如果出現的請求是probe.com/register.php,那麼這將如何失敗,以至於它不會重定向到probewebsites.com/register.php? – Steve