Назад | Перейти на главную страницу

Использование RewriteRule для сопоставления значения RewriteMap и игнорирования любых конечных косых черт и символов?

Я пытаюсь использовать RewriteMap в файле apache 2.4 virtualhost .conf для перенаправления ряда URL-адресов. Различные запросы могут относиться к одной записи на карте, и у меня возникают проблемы с сопоставлением этих вариантов в RewriteRule, особенно в конце косой черты. У меня сейчас что-то вроде:

RewriteRule "^/foo/(this|that|anotherthing)/bar/(.*)" "/${map:$2}"

это прекрасно работает, давая

/for/that/bar/request
/for/this/bar/request

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

/foo/this/bar/request/
/foo/this/bar/request/and/some/change

все должны возвращать одно и то же значение на основе совпадения по запросу. Кажется, я не могу найти правильное регулярное выражение для соответствия 0 или 1 / и любым дополнительным символам в конце строки. Это заставляет меня думать, что я неправильно понимаю важный фрагмент переписывания. Нужно ли мне использовать RewriteCond? Я надеялся на что-нибудь простое вроде

RewriteRule "^/foo/(this|that|anotherthing)/bar/(.*)(\/.*?|)" "/${map:$2}"

будет работать, но пока не повезло.

Вы почти всегда там. Попробуй это:

RewriteRule "^/foo/(this|that|anotherthing)/bar/(.+)(\/.+)?" "/${map:$2}"

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

Я также изменил .* экземпляры для .+ поскольку вы, вероятно, захотите сопоставить хотя бы 1 символ.

Редактировать:

Чтобы сделать завершающую косую черту необязательной, просто добавьте \/? к концу. Если вторая группа захвата пуста, она не будет отображаться при проверке завершающей косой черты.

RewriteRule "^/foo/(this|that|anotherthing)/bar/(.+)(\/.+)?\/?" "/${map:$2}"