Curinga / regex do Nginx no caminho do local

22

A configuração do Nginx que eu lance 404 para algo .phpcomo:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

No entanto, tenho algum arquivo index.php na subpasta que desejo executar. A configuração atual é como:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

funciona perfeitamente, mas o problema são locais duplicados e, se houver muitas subpáginas, a configuração se tornará enorme.

Eu tentei o curinga como * e algum regex, que diz que o teste nginx passou mas não carrega a página, ou seja, 404. O que eu tentei são:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

Existe alguma maneira de ter algum nome de caminho no local como regex ou curinga?


fonte

Respostas:

32

O =modificador no locationbloco é uma correspondência exata, sem caracteres curinga, correspondência de prefixo ou expressões regulares. É por isso que não funciona.

Na sua tentativa de regex, [a-z]corresponde a um único caractere entre ae z. É por isso que não funciona para você.

Você precisa configurar seus locais da seguinte maneira. Observe a ordem das locationinstruções. O nginx seleciona a primeira condição de regex correspondente.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

Eu uso a correspondência sensível a maiúsculas e minúsculas aqui ( ~modificador em vez de ~*). No primeiro caso, eu correspondo à primeira parte do caminho, depois um ou mais número de caracteres alfabéticos / numéricos e, em seguida index.php. Você pode modificar o intervalo de correspondência, mas lembre-se das +repetições de "uma ou mais".

O segundo corresponde a qualquer URI que termina com .php. Você não precisa de caracteres extras na sua versão devido à maneira como as expressões regulares funcionam.

Tero Kilkanen
fonte
obrigado, sim, a principal coisa que faltava na repetição era a regex. +consertou.
1

A ordem é importante, na descrição da "localização" do nginx :

Para encontrar um local que corresponda a uma determinada solicitação, o nginx primeiro verifica os locais definidos usando as sequências de prefixo (local do prefixo). Entre eles, o local com o prefixo correspondente mais longo é selecionado e lembrado. Em seguida, as expressões regulares são verificadas, na ordem em que aparecem no arquivo de configuração. A pesquisa de expressões regulares termina na primeira correspondência e a configuração correspondente é usada. Se nenhuma correspondência com uma expressão regular for encontrada, a configuração do local do prefixo lembrado anteriormente será usada.

Isso significa:

  • Primeiro =. (correspondência "prefixo de correspondência mais longo")
  • Então implícitos. (correspondência "prefixo de correspondência mais longo")
  • Então regex. (primeira partida)

Você precisa ajustar a ordem das peças regex.

Gea-Suan Lin
fonte