2

私はapacherewrite_mod(Apache / 2.2.17 Win32)で遊んでいて、rewriteRuleの非常に奇妙な動作に遭遇します。

私のスクリプトは主に、nice urlから名前が付けられた無限フィルターパラメーターを書き直しf1 .. f<infinity>、ループ内でそれらをクエリ変数として追加し、パスをクエリとして追加し、ページ番号を追加します。

それは完璧に機能しますが、お互いにルールを追加すると(スクリプトの最後のルール)

RewriteRule   ^(.+)\.html$                       /index.php?path=$1.html [QSA]

別のケースでは、スクリプトの開始時にrewriteruleの実行を変更します。




入力URL:

http://testing.loc/some/thing/index0-f1-nice-cars-f2-planes-f3-karts-f4-bike.html

すべての書き換え後にPHPで期待される結果:

$_SERVER[QUERY_STRING] => path=some/thing/&page=0&f1=nice-cars&f2=planes&f3=karts&f4=bike
$_SERVER[SCRIPT_NAME] => /index.php

スクリプトは次のようになります(次の部分は完璧に機能します):

# from: some/thing/index0-f1-nice-cars-f2-planes-f3-karts-f4-bike.html
# to:   some/thing/index0.html?f=-f1-nice-cars-f2-planes-f3-karts-f4-bike

RewriteRule   ^(.*/?index[0-9]*)((?:-f[0-9]+-.+?)+)\.html$   /$1.html?f=$2 [QSA]

# from: some/thing/index0.html?f=-f1-nice-cars-f2-planes-f3-karts-f4-bike
# to    index.php?path=some/thing/&page=0&f=-f1-nice-cars-f2-planes-f3-karts-f4-bike

#              (   $1   )     (  $2  )
RewriteRule   ^(.+/{0,1})index([0-9]*)\.html$    /index.php?path=$1&page=$2 [QSA]

# while in f is something like "f1-nice-cars" (for example)
# remove "f1-nice-cars" from f and add as query "f1=nice-cars"

#                              (%1)    (   %2  ) ( %3)(       %4       )
RewriteCond   %{QUERY_STRING} ^(.*)&f=-(f[0-9]+)-(.+?)((?:-f[0-9]+-.+)*)$ 
RewriteRule   ^index\.php$                       /index.php?%1&%2=%3&f=%4 [L]

# remove empty "f=" from query

RewriteCond   %{QUERY_STRING} ^(.*)&f=$ 
RewriteRule   ^index\.php$                       /index.php?%1

ここで、ルールがURLの形になった後:

index.php?path=some/thing/&page=0&f1=nice-cars&f2=planes&f3=karts&f4=bike

スクリプトに次のルールがなければ、すべてが完全に機能します。しかし、それを追加すると、このルール自体は何もしませんが、rewrite_modは、スクリプトの開始時に置換にさらに何かを追加します。

# rewrite rule for other paths without filters

RewriteRule   ^(.+)\.html$                       /index.php?path=$1.html [QSA]

実際に実行した後のすべてのスクリプトの結果は次のとおりです。

index.php?path=/some/thing/index0.html/some/thing/index0&f1=nice-cars&f2=planes&f3=karts&f4=bike
4

1 に答える 1

0

この問題の解決策を見つけました。2つのルールが.htaccessの1回のパスでURLと一致する場合、apacherewrite_modはメソッド「addpathinfopostfix」(バグや機能など)を使用し、リクエストのパスを台無しにします。したがって、その2つのルールにフラグ[L]を追加すると、結果はOKになります。

apacheは.htaccessを順番に渡し、次のルールには関係ないと思いました...

于 2012-05-29T11:49:55.497 に答える