Como posso criar uma localização no nginx que funcione com AND sem uma barra final?

33

Agora eu tenho essa configuração:

location ~ ^/phpmyadmin/(.*)$
{
        alias /home/phpmyadmin/$1;
}

No entanto, se eu visitar www.mysite.com/phpmyadmin (observe a falta de barra no final), ele não encontrará o que estou procurando por um 404. Suponho que não inclua a barra final. Como posso consertar isso?

    
por Rob 03.04.2012 / 07:05

7 respostas

33

Pode ser na expressão regular que você está usando -

location ~ ^/phpmyadmin/(.*)$

O acima irá corresponder ao / phpmyadmin /, / phpmyadmin / anything / else / here, mas não irá corresponder ao / phpmyadmin porque a expressão regular inclui a barra final.

Você provavelmente quer algo assim:

location ~ /phpmyadmin/?(.*)$ {
    alias /home/phpmyadmin/$1;
}

O ponto de interrogação é um quantificador de expressão regular e deve informar ao nginx para corresponder a zero ou a um dos caracteres anteriores (a barra).

HTH

    
por 03.04.2012 / 07:45
22

A melhor solução:

location ~ ^/phpmyadmin(?:/(.*))?$ {
    alias /home/phpmyadmin/$1;
}

Certifique-se de que o servidor tenha permissões para /home/phpmyadmin primeiro.

Explicação da diferença com a resposta aceita:

É tudo sobre expressões regulares .

Em primeiro lugar, o ^ char significa que você deseja corresponder desde o começo da string e não em algum lugar no meio. O $ no final significa corresponder ao final da string.

O (?:) significa grupo sem captura - não queremos isso nos resultados de captura, mas queremos agrupar alguns caracteres simples. Nós o agrupamos assim, porque queremos que o / char seja uma parte não significativa do caminho filho e não uma parte significativa do caminho pai.

    
por 07.02.2013 / 11:13
6

Por que você não usaria apenas

location /phpmyadmin {
    alias /home/phpmyadmin;
}

?

    
por 03.04.2012 / 07:18
2

Esse redirecionamento só irá reescrever URLs com e sem a barra final. Qualquer coisa que venha depois da barra não será sobrescrita.

domain.com/location = > redirecionado para domain.com/new/location
domínio.com/location = > redirecionado para domain.com/new/location
domain.com/location/other = > não redirecionado

server {
  # 301 URL Redirect
  rewrite ^/location/?$ /new/location permanent;
}
    
por 21.10.2013 / 00:52
1

Você tentou usar a diretiva try_files ?

try_files $uri $uri/ =404;
    
por 01.12.2014 / 11:12
1

Eu sei que essa é uma pergunta antiga, mas para qualquer um que acabe aqui pelo Google, eu resolvi da seguinte maneira (variação do @kbec, que foi muito bom):

location ~ ^/foo(/.*)?$ {
  proxy_pass http://$backend$1$is_args$args
}

Isto irá capturar qualquer variação de /foo e redirecioná-lo para /bar em outro URL (incluindo parâmetros). Estou mostrando isso com uma diretiva proxy_pass , mas também funcionaria com alias .

  • /foo - > %código%
  • /bar - > %código%
  • /foo/ - > %código%
  • /bar/ - > %código%

Funciona porque /foo/sub irá, opcionalmente, capturar os sub-recursos mais a barra inicial, para que não capture itens como /bar/sub . Ele também redirecionará uma barra final presente ou não presente adequadamente.

    
por 21.09.2016 / 10:53
0

Eu fiz assim

rewrite ^/promo/?$     http://example.com/promo/page43902.html;
location /promo/ {
    root /var/www;
}
    
por 01.10.2015 / 09:14