2012-03-23 69 views
1

我不知道這一點,當我在測試我的規則:HTACCESS和[PT]標誌忽略通過url傳遞的一部分?

http://htaccess.madewithlove.be/

它指出,應該工作。

我使用這個網址:

http://site.com/uk/en/clients/1/view

Options +FollowSymlinks 
RewriteEngine on 

RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(\.[^./]+)$ 
RewriteRule ^(.+[^/](?!\.php))$ $1/ [QSA,PT] 

#language 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{QUERY_STRING} !lang 
RewriteRule ^([a-z]{2})/([a-z]{2})(?:/(.*)|)$ /$1/$3?lang=$2 [NC,QSA,PT] 

#country 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{QUERY_STRING} !country 
RewriteRule ^([a-z]{2})(?:/(.*)|)$ /$2?country=$1 [NC,QSA,PT] 

#keyword 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT] 

#without actions 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php !-f 
RewriteCond %{QUERY_STRING} !keyword 
RewriteRule ^([^/]+)/(.*)$ /$2?keyword=$1 [NC,QSA,PT] 

#id 
RewriteCond %{QUERY_STRING} !id 
RewriteRule ^([^/]+)/(.*)$ /$2?id=$1&test2=$2 [NC,QSA,PT] 

#actions 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php !-f 
RewriteCond %{QUERY_STRING} !action 
RewriteRule ^/(.*)$ /?action=$1 [NC,QSA,PT] 

RewriteCond %{REQUEST_URI} !(\.[^./]+)$ 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule /$ /index.php [NC,QSA,L] 

目前,然而,它終止在ID,這是什麼是輸出:

Array ([id] => view [test2] => [keyword] => clients [test] => 1/view [country] => uk [lang] => en) 

我根本看不出來爲什麼它會忽略1 /並將ID設置爲view?

回答

0

請記住,The [PT] flag passes the URI back through the entire URL mapping mechanism包括mod_alias並回顧重寫引擎的所有規則(一次又一次),根據您看到的輸出數組,它看起來像這個規則可能是需要調整的:

#keyword 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT] 

^([^/]+)/(.*)/$是匹配對 「客戶端/ 1 /視圖/」 和第二反向引用變爲 「1 /視圖」,從而測試PARAM被分配到1 /視圖和URI變得/1/view

第二次匹配的URI是1/view,所以此規則的結果是/view/?keyword=1&test=view&keyword=clients&test=1/view&country=uk&lang=en(由於QSA)。

所以「測試」和「關鍵字」得到匹配兩次,因爲沒有條件,以防止這一點。所以一旦周圍所有的重寫規則多,我們終於到達了ID一部分,屆時,URI是view/,它匹配^([^/]+)/(.*)$和第一反向引用匹配($ 1)是「視圖」和第二( $ 2)是空白的,因爲(.*)什麼都不匹配。因此id = view。

我不知道這些參數值實際上應該結束的,但可能與反對「測試」或「關鍵字」查詢字符串PARAM在上述規則的RewriteCond檢查將阻止該規則被應用兩次?喜歡:

#keyword 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{QUERY_STRING} !keyword 
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT] 
+0

非常感謝,我現在完全理解mod_rewrite的工作方式了。我認爲它只是將字符串傳遞給下一步。 – 2012-03-26 08:19:33