私は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