Переписать .htaccess для преобразования каталогов в / key / value / key / value - PullRequest
3 голосов
/ 10 января 2012

Я видел это раньше, где правило использовалось для преобразования каталогов по URL в запросы запроса key = value.

Я понятия не имею, как это сделать, чтобы у меня было несколько таких пар.

Например:

http://www.example.com/mykey/myvalue/mykey2/myvalue2

Будет отображаться на:

http://www.example.com?mykey=myvalue&mykey2=myvalue2

Спасибо.

Ответы [ 3 ]

7 голосов
/ 10 января 2012

Используйте этот код .htaccess для рекурсивного перевода URI на основе key/value:

Options +FollowSymLinks -MultiViews
RewriteEngine on

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

При использовании этих правил URL-адрес http://localhost/n1/v1/n2/v2/n3/v3/n4/v4 будет ВНУТРЕННИМ перенаправлен на http://localhost/?n4=v4&n3=v3&n2=v2&n1=v1, обрабатывая каждую паруСегменты URL, разделенные / как пара имя-значение для QUERY_STRING.НО имейте в виду, что если URI не имеет четного числа сегментов, например: http://localhost/n1/v1/n2/, то он будет перенаправлен на http://localhost/?n1=v1, отбрасывая лишние n2.

0 голосов
/ 10 января 2012

У вас есть отличный учебник здесь

http://www.addedbytes.com/for-beginners/url-rewriting-for-beginners/

0 голосов
/ 10 января 2012

Наиболее распространенное использование этого типа паттернов - это Zend Framework, но я полагаю, что это достигается с помощью Front Controller, то есть кода PHP. Я считаю, что нет способа сопоставить неизвестное количество совпадений с помощью mod_rewrite. То есть, если вы знаете, что максимум будет, скажем, 3 пары, вы можете использовать ...

RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?$1=$2 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ /index.php?$1=$2&$3=$4 [QSA,L]
RewriteRule ([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ /index.php?$1=$2&$3=$4&$5=$6 [QSA,L]

... но если нет известного максимума, это невозможно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...