2012-03-23 3 views
1

私は私が私のルールをテストするときのようにこれを把握することはできません:それは、それが動作するはず述べHTACCESSと通過したURLの一部を無視する[PT]フラグ?

http://htaccess.madewithlove.be/

私はこのURLを使用しています:現時点では

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をビューとして無視するのはなぜですか?念頭に置い

答えて

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 /ビュー/" に対してマッチングされ、第2後方参照は "1 /ビュー" となり、従って試験PARAMは、1 /ビューに割り当てられて取得し、URIは/1/viewなります。

一致するURIの2回目の時刻は1/viewなので、このルールの結果は/view/?keyword=1&test=view&keyword=clients&test=1/view&country=uk&lang=en(QSAのため)です。

だから、「テスト」とこれを防止するための条件がないので、「キーワードは」二回マッチします。だから、はすべて書き換えルール周りにもう一度、我々は最終的にはそれまでに、ID部分を取得、URIは^([^/]+)/(.*)$一致し、最初の後方参照マッチ($ 1)「ビュー」であり、第二(これは、view/です$ 2)は空白です。(.*)は何も一致しません。したがって、id = view。

私はこれらのパラメータ値が実際のように終わることになっているかわからないんだけど、多分上記のルールでは、「テスト」または「キーワード」クエリ文字列のparamに対するのRewriteCondとのチェックが妨げられますそのルールは2度適用されない? Like:

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

これで、mod_rewriteの動作が完全に理解できるようになりました。私はそれが単に文字列を次のステップに渡したと思った。 –

関連する問題