Можно ли использовать именованные обратные ссылки в Apache mod_rewrite

Все,

Я наткнулся на интересную маленькую особенность в одном из моих RewriteRules, которую я хотел решить с помощью именованных обратных ссылок. Однако из того, что я вижу, это невозможно в Apache mod_rewrite.

У меня есть два входящих URL-адреса, каждый из которых содержит ключевую переменную, которую необходимо переписать в одно и то же базовое действие фреймворка.

Входящие URL:

/users/list/page-2
/users/list/2

Желаемая конечная точка перезаписи

/?module=users&action=list&pagenum=2

хотелось бы сделать что-то подобное

RewriteRule ^/(?P‹модуль›([\w]+))/(?P‹действие›([\w]+))/(страница-)?(?P‹pagenum›([\d]+ ))$ /?module=${module}&action=${action}&pagenum=${pagenum} [L,QSA]

Однако Apache вообще не хочет так играть и выдает мне нулевые значения в местах именованных обратных ссылок. Чтобы обойти проблему, я использовал числовые ссылки на захваченные группы ($1, $2, $4) (но я почти на полпути к лимиту Apache N=9). Так что это не шоу стопор для меня.

Я просто хотел бы знать, доступны ли именованные обратные ссылки в mod_rewrite Apache, и если да, то почему мой шаблон RewriteRule не соответствует?

Спасибо, Ян


person flungabunga    schedule 26.10.2010    source источник


Ответы (3)


Это может быть полезно:

https://httpd.apache.org/docs/trunk/rewrite/rewritemap.html

person denormalizer    schedule 27.10.2010
comment
Это, безусловно, способ достижения желаемого результата, но, как я уже сказал в вопросе, у меня уже есть встроенное решение с использованием числовых ссылок. Мой вопрос направлен непосредственно на использование встроенных именованных обратных ссылок PCRE, можно ли их использовать, и если да, то почему мой RewriteRule не работает. - person flungabunga; 27.10.2010
comment
Я думаю, что именованные перезаписи не поддерживаются. В директиве RewriteCond есть только четыре метода: 1. обратные ссылки RewriteRule 2. обратные ссылки RewriteCond 3. расширения RewriteMap (мое предложение) 4. Server-Variables. Только два из них не являются числовыми. А из нечисловых методов он не делает того, что вы пытаетесь сделать. - person denormalizer; 27.10.2010
comment
Да, я читал то же самое в документе, и это звучит справедливо, поскольку обратная ссылка N относится к набору (1‹=N‹=9), без упоминания именованной обратной ссылки. (Меня раздражает отсутствие упоминаний). Поднятый. - person flungabunga; 27.10.2010
comment
Путаница, возникшая из-за документации, в которой говорится, что mod_rewrite использует PCRE. Решение получено из документации, поскольку в нем указано, что метка обратной ссылки — N, где (1‹=N‹=9). Таким образом, можно с уверенностью предположить, что именованные обратные ссылки не поддерживаются в строке. - person flungabunga; 27.10.2010

Если последний ответ @superspace не работает, я бы предложил перенаправить все ссылки, которые не предназначены для прямого доступа к файлам/каталогам, и перенаправить их на индексную страницу. Затем настройте класс маршрутизации, который принимает имя страницы и выполняет сопоставление вручную, чтобы вы могли иметь свой именованный массив регулярных выражений захвата и перечислять шаблоны или страницы, которые вы хотите передать.

Если вам нужно пойти по этому пути, дайте мне знать, и я могу предложить код из моих классов.

person meder omuraliev    schedule 27.10.2010
comment
Использовали такие классы в прошлом в различных структурах. Особенно удобно, когда mod_rewrite недоступен или вы используете управляемый веб-сервер, а служба поддержки медлительна. Но да, у меня есть простое встроенное решение, но было бы здорово узнать, доступны ли именованные обратные ссылки, и если да, то как. - person flungabunga; 27.10.2010

Никаких обратных ссылок, кажется, после просмотра исходного кода mod_rewrite.

В любом случае я бы рекомендовал использовать параметр RewriteMap вместо длинного списка RewriteRules, так как это будет намного быстрее, чем повторение длинного списка.

person Sasha    schedule 27.10.2010