#regex #nginx #url-rewriting
#регулярное выражение #nginx #url-перезапись
Вопрос:
Нам нужно перенаправить все ссылки, содержащие html, на не html, пример:
domain.com/post.html -> domain.com/post domain.com/2010/10/post.html -> domain.com/2010/10/post
однако нам нужно исключить URL-адреса, содержащие «плагины» в пути, например:
domain.com/wp-content/plugins/something/test.html не следует перенаправлять.
Попытка выполнить это с помощью:
rewrite ^(/.*).html(?.*)?$ $1$2 permanent;
и добавление отрицательного взгляда назад:
rewrite ^(?!plugins)(/.*).html(?.*)?$ $1$2 permanent;
любой вариант, который я пробую, кажется, имеет проблему. Или все равно удалит .html из URL, даже если содержит плагины в URL.
Ответ №1:
Это должно сработать:
rewrite ^(?!/[^/] /plugins/)(/.*).html(?.*)?$ $1$2 permanent;
Тесты:
/post.html ==> domain.com/post
/post.html?foo=bar ==> domain.com/post?foo=bar
/2010/10/post.html ==> domain.com/2010/10/post
/wp-content/plugins/something/test.html (no match)
Объяснение регулярного выражения:
^
…$
— привязка в начале и конце(?!/[^/] /plugins/)
— отрицательный прогноз, ожидаемый/plugins/
во втором подкаталоге(/.*).html(?.*)?$
— захват чего-либо до.html
и захват чего-либо после (если есть)
Комментарии:
1. Именно то, что было необходимо, спасибо за объяснение, а также