Я пытаюсь использовать RewriteMap в файле .conf виртуального хоста apache 2.4 для перенаправления ряда 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
должны все вернуть такое же значение, основанное на совпадении по запросу. Я могу' t, похоже, прибивает правильное регулярное выражение для соответствия 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 /(.+)(\/.+)?\/ ? " "/ $ {карта:$ 2} "