Gdy mam wiele połączonych Łańcuch Rewrite, tylko grupy przechwytujące ostatniego RewriteCond mogą być przywoływane z %0
- %9
.Odwołanie grup przechwytywania wielokrotnego RewriteCond w RewriteRule
W poniższym problemie parametry w ciągu zapytania adresu URL mogą być w dowolnej kolejności. Analizować je w fantazyjne url byłyby potrzebne, aby dopasować każdy parametr w ciągu zapytania indywidualnie:
RewriteCond %{QUERY_STRING} param1=([^&]+)
RewriteCond %{QUERY_STRING} param2=([^&]+)
RewriteCond %{QUERY_STRING} param3=([^&]+)
RewriteRule ^foo$ bar/%1/%2/%3/ [R]
Jak podkreśliłem ... to nie działa. Aby rozwiązać ten problem, mogę odwołać się do grupy przechwytywania poprzedniej RewriteCond w następnym RewriteCond i „propagować” każdy parametr do rzeczywistej RewriteRule:
RewriteCond %{QUERY_STRING} param1=([^&]+)
RewriteCond %1&%{QUERY_STRING} ^([^&]*)&.*param2=([^&]+)
RewriteCond %1&%2&%{QUERY_STRING} ^([^&]*)&([^&]*)&.*param3=([^&]+)
RewriteRule ^foo$ bar/%1/%2/%3/ [R]
To powinno działać, ale dla każdego dodatkowego parametru to get Messier. Innym rozwiązaniem może być parsowanie jednego parametru i przekierowanie klienta po każdym parametrze (co spowoduje długi łańcuch przekierowań, których chciałbym uniknąć).
Czy istnieje przejrzysty sposób uzyskiwania dostępu do grupy przechwytywania wszystkich RewriteCond jest w RewriteRule (np jest to możliwe, aby je wymienić lub przypisać je do zmiennej, więc mogę odwołać je gdzieś indziej?)
+1 za wielkie pytanie. Stawiłem też czoła temu problemowi i chciałbym znać odpowiedź: – anubhava
Dokumenty mod_rewrite mówią, że backreferences RewriteCond zachowują ** ostatnio dopasowany RewriteCond ** w bieżącym zestawie warunków, więc tak, twoja druga odpowiedź może być tylko odpowiedź na tej trasie. Biorąc pod uwagę jego złożoność, czy zastanawiałeś się nad ustawieniem skryptu w 'foo', który analizuje GET) lub POST) i przekierowuje do odpowiedniego' paska'? – miah