Como remover uma barra dupla nos URLs exibidos pelo nginx?

9

Preciso replicar as seguintes regras de reescrita do Apache na configuração do Nginx no Ubuntu 12.04. Qual é o nginx equivalente a:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
codecowboy
fonte
Quem encontrou isso online e tenta copiar e colar as respostas sugeridas, tenha cuidado se estiver usando uma configuração do Virtualbox com portas personalizadas. Eu tive que mudar para ser, por exemplo, rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;onde 4321 é a porta externa do nginx do Virtualbox ao qual meu navegador se conecta.
aexl

Respostas:

6

Eu gostaria de sugerir esta abordagem:

# remove multiple sequences of forward slashes
# rewrite URI has duplicate slashes already removed by Nginx (merge_slashes on), just need to rewrite back to current location
# note: the use of "^[^?]*?" avoids matches in querystring portion which would cause an infinite redirect loop
if ($request_uri ~ "^[^?]*?//") {
rewrite "^" $scheme://$host$uri permanent;
}

Ele usa o comportamento padrão do nginx - fusão de barras, portanto, não precisamos substituir barras, simplesmente redirecionando

encontrado aqui

Sonâmbulo
fonte
Isso não funciona para SSL via certbot se você tiver o nginx como um proxy reverso via # proxy_pass
Jonathan Jonathan
3

Eu achei a resposta do kwo para não funcionar. Olhando para o meu log de depuração, é isso que acontece:

2014/08/18 15:51:04 [debug] 16361#0: *1 http script regex: "(.*)//+(.*)"
2014/08/18 15:51:04 [notice] 16361#0: *1 "(.*)//+(.*)" does not match "/contact-us/", client: 59.167.230.186, server: *.domain.edu, request: "GET //////contact-us//// HTTP/1.1", host: 
"test.domain.edu"

Eu achei que isso funcionou para mim:

if ($request_uri ~* "\/\/") {
  rewrite ^/(.*)      $scheme://$host/$1    permanent;
}

Ref: http://rosslawley.co.uk/archive/old/2010/01/10/nginx-how-to-url-cleaning-removing/

DaveQB
fonte
Link de referência é o que você precisa verificar. A solução correta está lá. Vou tentar editar a resposta.
Anup Nair
1

Tente o seguinte:

merge_slashes off;
rewrite (.*)//+(.*) $1/$2 permanent;

Pode haver vários redirecionamentos para barras> 3 ou vários grupos de barras.

kwo
fonte
'merge_slashes off' não fez diferença e não resultou em alterações.
Anup Nair
1
Por que merge_slashes on;simplesmente não funciona? O nginx é buggy?
Jonathan
1
@ Jonathan - acabei de me deparar com isso também. Pelo que entendi, isso merge_slashes onnão faz o que você está pensando. Basicamente, diz ao nginx para aceitar // e / e /// como uma única barra (para não mesclar e redirecionar por conta própria)
Andrew Newby
1

Falo da experiência de executar vários servidores de produção e servidores de desenvolvimento para uma equipe. Não faça isso no nginx. Em vez disso, use seu roteador dentro do servidor de aplicativos (JS / PHP etc).

O Nginx não é confiável para trabalhos substantivos. Por exemplo, redirecionamentos, reescritas e ifcláusulas não são determinísticas se você alterar sua configuração para usar SSL, um proxy reverso, portas ocultas e assim por diante. Portanto, você pode fazê-lo funcionar corretamente em um ambiente, mas pode ser impossível continuar trabalhando em outro.

Atenha-se a uma linguagem de programação adequada para resolver problemas, mesmo que simples como a barra dupla. Você me agradecerá mais tarde.

Jonathan
fonte
Embora eu concorde com sua opinião, acredito que devemos dar às pessoas a opção de formar sua própria opinião sobre o assunto. Eu prefiro o Apache ao Nginx, pelo mesmo motivo que o seu. Observe que o Apache mod_rewrite também pode ser considerado como uma linguagem de programação simples. :-)
peterh - Restabelece Monica
-1

URL example.com//dir1////dir2///dir3 e mais Tente isso, está funcionando para mim

merge_slashes off; localização ~ ^ (. *?) // + (. *?) $ {return 301 $ 1 / $ 2; }

SoniNow
fonte