nginx переписать удалить html, за исключением случаев, если URL содержит строку

#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. Именно то, что было необходимо, спасибо за объяснение, а также