Объедините два правила переписывания модов - PullRequest
1 голос
/ 20 июля 2011

Текущий статус: Во-первых, я хотел бы отметить, что этот вопрос очень сильно связан с вопросом, который я разместил два дня назад.С тех пор я пытался решить проблему, с которой столкнулся, и столкнулся с другими проблемами.Надеюсь, это не является «двойным постом»?

Я создал два правила переписывания модов, которые, кажется, работают изолированно для создания желаемого эффекта.Они показаны ниже:

RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*/)?([A-Za-z0-9.-]+)_([A-Za-z0-9.-]*) $1?$2=$3&%1 [L]

Приведенное выше правило принимает URL-адрес, подобный следующему:

www.site.com/param1/thing/sortorder_5/getparam2_6/

, и преобразует его в следующее:

www.site.com/param1/thing/?sortorder=5&getparam2_6/

Второе правиловыглядит следующим образом:

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

Этот URL-адрес принимает следующий код:

http://www.site.com/cmd/param1/thing/cmd2/param2/

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

http://www.site.com?cmd=param1/thing&cmd2=param/

Желаемый результат:

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

http://www.site.com/cmd/param1/cmd2/param2/sortorder_5

преобразуется в:

http://www.site.com?cmd=param1&cmd2=param2&sortorder=5

Любой, кто скажет мне, как начать, был бы очень любезен.Я экспериментировал с МНОЖЕСТВОМ кода переписывания модов в течение нескольких дней, но не повезло.Мои знания по переписыванию regex / mod на самом деле не на пустом месте, поэтому мои извинения за это!Весь код переписывания модов вставлен ниже.Спасибо.

RewriteEngine On

# This block works fine in isolation
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*/)?([A-Za-z0-9.-]+)_([A-Za-z0-9.-]*) $1?$2=$3&%1 [L]

# This block also works fine in isolation
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(.+)) $1?$2=$3&%1 [L]

# This block should append the query string to index.php (front controller)
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^.*$ index.php?%1 [L]

1 Ответ

0 голосов
/ 20 июля 2011

Это проверено и работает:

RewriteEngine On
RewriteRule ^(cmd[^/]*)/([^/]+)/?(.*)$ $3?$1=$2 [QSA,NC,L]
RewriteRule ^([a-z\d.-]+)_([a-z\d.-]+)/?(.*)$ $3?$1=$2 [QSA,NC,L]

См. mod_rewrite docs о флагах.

Пример запроса:

http://localhost:8080/test/cmd1/foo/cmd2/bar/foo_bar/cmd42/everything

Концывверх по адресу:

http://localhost:8080/test/index.pl?cmd42=everything&foo=bar&cmd2=bar&cmd1=foo

С .htaccess, расположенным по /test/, и index.pl печать строки запроса:

cmd42=everything&foo=bar&cmd2=bar&cmd1=foo

Этот запрос имеет журнал перенаправления:

[rid#2f0b590/initial] (2) [perdir /root_http/test/] rewrite 'cmd1/foo/cmd2/bar/foo_bar/cmd42/everything' -> 'cmd2/bar/foo_bar/cmd42/everything?cmd1=foo'
[rid#2f0b590/initial] (2) [perdir /root_http/test/] strip document_root prefix: /root_http/test/cmd2/bar/foo_bar/cmd42/everything -> /test/cmd2/bar/foo_bar/cmd42/everything
[rid#2f0b590/initial] (1) [perdir /root_http/test/] internal redirect with /test/cmd2/bar/foo_bar/cmd42/everything [INTERNAL REDIRECT]
[rid#10dec40/initial/redir#1] (2) [perdir /root_http/test/] rewrite 'cmd2/bar/foo_bar/cmd42/everything' -> 'foo_bar/cmd42/everything?cmd2=bar'
[rid#10dec40/initial/redir#1] (2) [perdir /root_http/test/] strip document_root prefix: /root_http/test/foo_bar/cmd42/everything -> /test/foo_bar/cmd42/everything
[rid#10dec40/initial/redir#1] (1) [perdir /root_http/test/] internal redirect with /test/foo_bar/cmd42/everything [INTERNAL REDIRECT]
[rid#2e16d90/initial/redir#2] (2) [perdir /root_http/test/] rewrite 'foo_bar/cmd42/everything' -> 'cmd42/everything?foo=bar'
[rid#2e16d90/initial/redir#2] (2) [perdir /root_http/test/] strip document_root prefix: /root_http/test/cmd42/everything -> /test/cmd42/everything
[rid#2e16d90/initial/redir#2] (1) [perdir /root_http/test/] internal redirect with /test/cmd42/everything [INTERNAL REDIRECT]
[rid#2f0d558/initial/redir#3] (2) [perdir /root_http/test/] rewrite 'cmd42/everything' -> '?cmd42=everything'
[rid#2f0d558/initial/redir#3] (2) [perdir /root_http/test/] strip document_root prefix: /root_http/test/ -> /test/
[rid#2f0d558/initial/redir#3] (1) [perdir /root_http/test/] internal redirect with /test/ [INTERNAL REDIRECT]
[rid#2f0eac8/initial/redir#4] (1) [perdir /root_http/test/] pass through /root_http/test/
[rid#10c98b0/subreq] (1) [perdir /root_http/test/] pass through /root_http/test/index.html
[rid#10c98b0/subreq] (1) [perdir /root_http/test/] pass through /root_http/test/index.shtml
[rid#10c98b0/subreq] (1) [perdir /root_http/test/] pass through /root_http/test/index.cgi
[rid#10c98b0/subreq] (1) [perdir /root_http/test/] pass through /root_http/test/index.fcgi
[rid#10c98b0/subreq] (1) [perdir /root_http/test/] pass through /root_http/test/index.pl

Этот журнал можно увидеть, добавив его в конфигурацию вашего сервера:

RewriteLog "logs/rewrite.log"
RewriteLogLevel 2
...