Nginx adiciona barra final sem reescrever

Nginx adiciona barra final sem reescrever

Estou tentando criar um redirecionamento para adicionar uma barra final,

location / {
  if($request_uri ~ ^([^.]*[^/])$){
    return 301 https://$host$request_uri/;
  }
}

Não tenho ideia de como fazer a correspondência no if, quando simplesmente crio o redirecionamento com / - funciona, apenas esse regex parece quebrado.

ATUALIZAR

Reescrever eu tentei

location / {
  rewrite ^([^.]*[^/])$ $1/ permanent;
  .....
}

e

if ($http_x_forwarded_proto != "https") {
  return 301 https://$host$request_uri;
}

funciona bem, redireciona para https, eu queria criar regex com ele também

Responder1

Há muito tempo resolvido, mas vejo muitas pessoas verificando esta questão, então, se bem me lembro, não tinha essa linha de código e ela estava me redirecionando:

port_in_redirect off;

Eu sei, não mencionei as portas em questão, de jeito nenhum isso poderia ser respondido, mas deixarei aqui se alguém tiver o mesmo problema

Responder2

Se entendi a pergunta corretamente, você deseja veicular automaticamente, sem usar um redirecionamento 301,http://example.com/foo/index.htmlquando o pedido é parahttp://example.com/foosem barra final?

Nesse caso, descobri que esta configuração try_files funciona:

try_files $uri $uri/index.html $uri/ =404;
  • O primeiro $uricorresponde exatamente ao uri
  • O segundo $uri/index.htmlcorresponde a um diretório contendo index.html onde o último elemento do caminho corresponde ao nome do diretório, sem barra final
  • O terceiro $uri/corresponde ao diretório
  • O quarto =404retorna a página de erro 404 se nenhum dos padrões anteriores corresponder.

Responder3

Isso parece funcionar conforme o esperado:

location / {
    if ($request_uri ~ ^([^.]*[^/])$) {
        return 301 https://$host$request_uri/;
    }
    try_files $uri $uri/ /index.html;
    ....
}

Não tenho certeza se vejo a diferença com o que você tentou, exceto o erro de sintaxe que você deveria ter encontrado devido à falta de espaços na ifinstrução (pode ser um erro de digitação). ...ou talvez porque você tem outras diretivas que você não nos mostra e que substituem esta.

informação relacionada