Рекурсивный mod_rewrite для дружественных поисковых запросов

Я читал предыдущее решение рекурсивной проблемы mod_rewrite, которая похожа на то, что я пытаюсь сделать, разница заключается в том, что я отправляю все запросы через файл index.php и поэтому не нужно указывать скрипт в запросе.

По сути, я хочу рекурсивно конвертировать любое количество параметров в дружественный поисковой системе URL:

example.com/param1/val1/param2/val2/... 

к регулярной строке запроса:

 example.com/index.php?param1=val1&param2=val2&... 

До сих пор я не увенчался успехом в моих попытках:

 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^([^/]+)/([^/]+) $1=$2&%1 [L] RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)$ index.php?%1 [L] 

Кто-нибудь сможет предложить какие-либо предложения?

    Я скопировал решение из этого другого вопроса и изменил его следующим образом:

     RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*/)?([^/]+)/([^/]+) $1?$2=$3&%1 [L] RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^.*$ index.php?%1 [L] 

    Это почти то же самое, за исключением первого правила, первое совпадение является необязательным, а во втором правиле совпадение находится на том, что осталось после того, как все остальные пары будут сопоставлены.

    При нечетном числе параметров первый параметр игнорируется.

    Одно замечание: если вы ожидаете иметь множество параметров, возможно, вам придется изменить некоторые настройки.

    Добавьте что-то подобное в ваш .htaccess файл

     RewriteOptions MaxRedirects=20 

    и что-то вроде этого в файле apache conf

     LimitInternalRecursion 20 

    Вместо «20» выберите любое количество рекурсий (пар), которые нужно разрешить (по умолчанию 10).

    Я понимаю, что это очень старая нить. Но поскольку ни один из ответов, размещенных здесь, не работал для меня, и я хочу опубликовать свой ответ, чтобы посетители могли его использовать, если они этого хотят, поэтому я отвечаю на него здесь:

     Options +FollowSymlinks -MultiViews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/([^/]+)(/.*)?$ $3?$1=$2 [N,QSA,DPI] RewriteRule ^(/[^/]+|[^/]+/|/?)$ /index.php [L,QSA,DPI] 

    Для получения дополнительной информации см. Мой ответ на MOD_REWRITE для URL-переменных, удаление пустых параметров и использование более 1 поля для первой и второй переменных

    да…

    Из приведенных здесь примеров:

    http://iirf.codeplex.com/sourcecontrol/changeset/view/62027?projectName=IIRF#981491

    Этот набор правил итеративно переводит пару сегментов URL-адреса в сегмент n = v querystring.

     # handle case with no query string. This rule fires the first time through, # and converts the first pair of URL path segments to an=v query string segment. RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)/([^\?]+)$ /$3?$1=$2 # handle the case where there is an existing query string, and more than one pair of # URL path segments remaining. This rule fires potentially multiple times. RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)/([^\?]+)\?(.+)$ /$3?$4&$1=$2 # Handle the case with a query string, and exactly one pair of URL path segments. # This fires once (last). # It fires when there is an even number of segments. RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)\?([^\?]+)$ /help.cfm?$3&$1=$2 [L] # Handle the case with no query string, and exactly one pair of URL path segments. # This fires once (last). RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)$ /help.cfm?$1=$2 [L] # Handle the edge case, where there is an odd number of segments, which is invalid # for these purposes. # # This fires once, after all the other pairs have been parsed. In fact the filter # cannot know that there is an odd number of segments until it does all the matching. # So at the end we see, we have one left over segment, and we # redirect to a 404 page. RewriteRule ^/(?!index\.php)([^\/\?]+)\?([^\?]+)$ /ResourceNotFound.php [L] # Handle the edge case where there is only one segment. This is also an error # in this ruleset. RewriteRule ^/(?!index\.php)([^\/\?]+)$ /FoundOnlyOneSegment.php [L] 

    Этот набор правил может быть не совсем таким, каким вы хотите, но он иллюстрирует подход. Он не был разработан для mod_rewrite, но для IIRF, который является переписчиком для IIS. Но синтаксис должен быть одинаковым для mod_rewrite, поэтому эти правила должны работать.

    Я не знаю, имеет ли mod_rewrite средство ведения журнала или возможность проверки командной строки, но это делает IIRF, что облегчает просмотр того, как работают отдельные правила, или результат набора правил.

    У IIRF есть итерационный предел, который по умолчанию равен 10. Есть способ повысить этот предел до 30, что довольно высоко, но все же не бесконечно. Это означает, что он не будет работать для «любого количества параметров». Он может конвертировать до 15 пар параметров. Я не знаю, имеет ли mod_rewrite аналогичный предел.

    Попробуйте следующие правила:

     RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ - [L] RewriteRule ^([^/]+)/([^/]+)(/(.*))?$ /$4?$1=$2 [N,QSA] RewriteRule ^$ index.php [L] 

    Первое правило – исключить запросы для существующих файлов. Второе правило будет выполнять работу и переписать каждую пару имен и значений. И третье правило состоит в том, чтобы переписать окончательный URI в index.php .