2014-02-16 69 views
0

我真的很難與正則表達式和mod_rewrite,並試圖更好地理解。我有一些重寫腳本以及我認爲正在發表的評論。請讓我知道我是否準確地描述了正在發生的事情。謝謝瞭解mod_rewrite和正則表達式

# don't do the following if Apache isn't configured with mod_rewrite 
<IfModule mod_rewrite.c> 

# self explanatory 
RewriteEngine on 

# Reference everything from Apache root (i.e. /var/www/html) 
RewriteBase/

# Create a condition if statement and execute the following rules until the next condition is reached. 
# This one checks if the request is a valid directory, a valid file, or a valid symbolic link 
# The % symbol has something to do with backreference of the matched string in the condition. 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -l 

# Don't do anything (how?), and the [L] means to not match this condition anymore 
RewriteRule^- [L] 

#^and $ are the start and end of the patern. 
# ([^/]+) takes all characters up to the first /, 
# and then adds one more character because the + which is the /, 
# and stores it as $1. 
# It will only be matched, however, if a/follows plus 0 or 1 character due to the ?. 
# Then redirect by adding ?p=$1 where $1 is the stored variable described above. 
# The L flag means don't try to do it again, and QSA somehow adds the previous URL to it. 
RewriteRule ^([^/]+)/?$ ?p=$1 [L,QSA] 

# close if statement 
</IfModule> 
+0

你的問題是什麼? –

+1

@RahilWazir他沒有問題。閱讀文件中的評論,他想知道他對規則的解釋以及他們的工作方式是否正確。 –

+0

瞭解正在發生的事情!這就像黑魔法,幾乎不可能排除故障。 – user1032531

回答

1

重寫條件影響緊隨其後的規則,這意味着3個條件的位置:

RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -l 

只能獲得適用於緊隨其後的規則:

RewriteRule^- [L] 

並且它不會應用於底部的規則。條件基本上意味着:任何現有的文件,目錄或符號鏈接。 %不是反向引用,它意味着一個重寫變量,在%{REQUEST_FILENAME}的情況下,它是由URL文件映射處理器映射到的文件名。因此,例如,如果網址爲http://example.com/some/path/and/file.php,則%{REQUEST_FILENAME}將類似於/var/www/localhost/htdocs/some/path/and/file.php,假設您的文檔根目錄爲/var/www/localhost/htdocs/

的:

RewriteRule^- [L] 

規則匹配的一切(的^比賽開始的字符串,其本質就是一切)和-手段,不改變URI,只是讓它通過。 [L]標誌停止重寫。這很重要的原因是重寫引擎將無限期地循環遍歷所有規則(或直到達到內部遞歸限制)或直到URI停止更改。這將完全停止重寫,因爲輸入URI不變。

圖案:

^([^/]+)/?$ 

指:任何不是一個/,並在後面加上一個可選/?表示前一個字符是可選的。因此,像path/file.php這樣的請求將不匹配,因爲它的中間有/。但是path/會匹配。 path部分使用()字符進行分組,並使用$進行反向引用。因此,結果將是:

/?p=path 

QSA標誌追加任何現有的查詢字符串,所以像一個請求:

/path-name/?foo=bar 

被改寫爲:

/?p=path-name&foo=bar 

沒有QSA,該&foo=bar韓元不在那裏。

+0

感謝Jon,讓我再讀約10次!關於'%'bieng是一個重寫變量,它是否像使用'$ 1',如果是,它在哪裏被插入? – user1032531

+0

@ user1032531'$ 1'是反向引用,它不一樣。然而,它的工作方式是重寫引擎在「重寫規則」**第一個**中處理匹配,然後檢查條件。這意味着如果規則是'RewriteRule(。*)something',那麼你可以使用'RewriteCond $ 1 -f'作爲它的條件,但是如果你沒有分組,那麼'$ 1'是空白的 –