Я пытаюсь использовать 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}"