Multiviews no estilo Apache com Nginx

4

Estou interessado em mudar do Apache / mod_php para o Nginx para alguns sites que não são do CMS que estou executando. Os sites em questão são arquivos HTML completamente estáticos ou PHP simples, mas a única coisa que eles têm em comum é que eu estou atualmente usando o mod_negotiation do Apache para atendê-los sem extensões de arquivo. Não estou preocupado com a negociação de conteúdo real; Estou usando isso para não usar extensões de arquivo em meus URLs.

Por exemplo, o arquivo em /info/contact.php é acessado por meio de um URL de apenas /info/contact

O arquivo real é um arquivo .php nesse local, mas não uso a extensão nos URLs. Isso me dá URLs um pouco menores e mais limpas, além de não expor o que é essencialmente um detalhe de implementação sem sentido para o usuário. No Apache, tudo o que isso significa é habilitar mod_negociação e adicionar + MultiViews às Opções do site. Em Nginx eu sei que vou reescrever de alguma forma, mas ser novo no Nginx, não sei exatamente como fazer isso.

Esses sites estão trabalhando no proxy do Nginx para o Apache, mas eu gostaria de tentar executá-los somente com o Nginx / fastcgi. Eles funcionam bem assim, desde que eu esteja usando as extensões, então o aspecto fastcgi está funcionando muito bem. Minha preocupação agora é apenas remover essas extensões.

É importante ter em mente que o nome do arquivo não é sempre na URL, no caso de subdiretórios. Isto é,

/foo/bar deve procurar /foo/bar.php ou /foo/bar/index.php

/foo/ deve procurar /foo/index.php

Existe uma maneira simples de conseguir isso com o Nginx ou devo ficar com o proxy para o Apache?

    
por Kenn 11.12.2010 / 07:31

2 respostas

2

Você não precisa de nenhuma reescrita tediosa, o try_files funciona perfeitamente para isso. É essencialmente apenas uma linha.

server {
    server_name foo.com;
    root /your/root/path;
    index index.php;

    location /
        try_files $uri.php $uri/ /notfound.html;
    }

    # Your standard PHP location and everything else is still required here.
}
    
por 11.12.2010 / 08:58
1

Como alternativa, você pode usar:

try_files $uri $uri/ index.php;

sem o / na frente de index.php, ele procuraria /foo/bar/index.php se não encontrasse /foo/bar/somethingelse.php . (a maioria das pessoas tem /index.php como o fallback, como normalmente é o que funcionaria com o wordpress e CMSs similares).

    
por 17.11.2011 / 13:12