nginx соответствует папке в пути и без .html, который нужно переписать с добавлением .html - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть URL, который содержит подпапки в пути и может содержать или не содержать .html.

например. https://www.example.com/store/test/en/test/ANYCATEGORY/ANDCATEGORY/OPTIONALCATEGORY/PROGRAMNAME/p/100002020

Я хочу соответствовать, если URL содержит "/ p /" в пути И в конце нет .html. Если эти условия соблюдены, я хочу добавить с .html

например. https://www.example.com/store/test/en/test/ANYCATEGORY/ANDCATEGORY/OPTIONALCATEGORY/PROGRAMNAME/p/100002020

Я пытался использовать операторы if и местоположение, но не повезло ни с одним из них.

Это то, что я пытался без удачи:

    if ($uri ~ ^(.*)/p/(.*)$){
      rewrite ^(.+)/$ $1.html permanent;
    }
    if ($uri ~ ^(.*)/p/(.*[^.html])$){
      rewrite ^(.+)/$ $1.html permanent;
    }
  location ~ ^(.*)/p/(.*[^.html])$ {
      rewrite ^(.+)/$ $1.html permanent;
  }

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019
  location ~ ^(?=.*\/p\/)(?!.*\.html$).+$ {
    try_files $uri $uri/ @rewrite;
  }
  location @rewrite {
    rewrite ^(.+)$ $1.html permanent;
  }
0 голосов
/ 03 апреля 2019

Вам нужен положительный взгляд вперед (?=.*\/p\/) для обеспечения присутствия /p/ и отрицательный взгляд вперед (?!.*\.html$), чтобы строка не заканчивалась .html.Вот правильное регулярное выражение:

^(?=.*\/p\/)(?!.*\.html$).+$

Демо

Затем попробуйте переписать условие if так, как вы это делали, что должнобудь это,

location ~ ^(?=.*\/p\/)(?!.*\.html$).+$ {
    rewrite ^(.+)/$ $1.html permanent;
}

Кроме того, в вашем регулярном выражении [^.html] это отрицание символов и будет отменять только определенные символы, присутствующие в наборе символов после ^, а для отрицания последовательности символов вам необходимоиспользуйте шаблон с отрицательным взглядом вперед, как я делал в своем регулярном выражении.

...