2017-03-10 51 views
1

我有以下線在我的.htaccess文件:爲什麼RewriteRule只有在更改行位置時才起作用?

RewriteCond %{QUERY_STRING} id=([0-9]+) 
RewriteRule ^page/([0-9]+)/$ ?page=$1 [L] 
RewriteRule ^(20\d\d)/page/([0-9]+)/$ ?yearMeasure=$1&page=$2 [L] 
RewriteRule ^(20\d\d)/$ ?yearMeasure=$1 [L] 
RewriteRule ^category/([A-Za-z0-9-]+)/page/([0-9]+)/$ ?category=$1&page=$2 [L] 
RewriteRule ^category/([A-Za-z0-9-]+)/$ ?category=$1 [L] 
RewriteRule ^(20\d\d)/([A-Za-z0-9-]+)/$ ?type=post&year=$1&title=$2 [L,QSA] 

當文件如上離開時,服務器不會捕捉/頁/ 1 /。相反,它會返回一個404錯誤。但是,當我翻轉第二和第三行時,一切都很完美。爲什麼是這樣?

RewriteCond %{QUERY_STRING} id=([0-9]+) 
RewriteRule ^(20\d\d)/page/([0-9]+)/$ ?yearMeasure=$1&page=$2 [L] 
RewriteRule ^page/([0-9]+)/$ ?page=$1 [L] 
RewriteRule ^(20\d\d)/$ ?yearMeasure=$1 [L] 
RewriteRule ^category/([A-Za-z0-9-]+)/page/([0-9]+)/$ ?category=$1&page=$2 [L] 
RewriteRule ^category/([A-Za-z0-9-]+)/$ ?category=$1 [L] 
RewriteRule ^(20\d\d)/([A-Za-z0-9-]+)/$ ?type=post&year=$1&title=$2 [L,QSA] 

編輯:

試驗幾分鐘後,似乎RewriteCond %{QUERY_STRING} id=([0-9]+)後可直接接觸線是無效的。

任何幫助表示讚賞。

回答

0

不限RewriteCond屬於RewriteRule直接跟隨它

的RewriteCond指令定義了一個規則的條件。一個或多個RewriteCond可以在一個RewriteRule指令之前。以下規則僅在URI的當前狀態與其模式匹配且符合這些條件時才使用。

1. RewriteCond ... 
2. RewriteRule ... 
3. RewriteCond ... 
4. RewriteRule ... 
5. RewriteRule ... 

因此,在這種情況下,條件1屬於規則2,和條件3屬於規則4,最後規則5沒有條件的。


這意味着,當你有

1. RewriteCond ... 
2. RewriteRule ... 
3. RewriteRule ... 

和切換規則2和3,

1. RewriteCond ... 
3. RewriteRule ... 
2. RewriteRule ... 

條件屬於其他規則。


當您使用第一套規則和要求/page/1/?id=5,它會工作,因爲現在前狀態「QUERY_STRING比賽id=([0-9]+)」得到滿足。

相關問題