Nginx - rotear todas as solicitações para um único script

11

Eu tenho um script PHP que lida com roteamento de scripts e faz todo tipo de coisas sofisticadas. Ele foi originalmente projetado para o Apache, mas estou tentando migrá-lo para o nginx para algumas das minhas caixas. No momento, estou tentando facilitar as coisas em um servidor de teste.

Portanto, a maneira como o script funciona é que ele intercepta todo o tráfego HTTP do diretório (no Apache) usando um .htaccessarquivo. Aqui está o que parece:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>

Bem direto. Todas as solicitações são executadas index.php, pura e simplesmente.

Estou procurando imitar esse comportamento no nginx, mas ainda não encontrei uma maneira. Alguém tem alguma sugestão?

Aqui está uma cópia do meu nginx.confarquivo no momento. Observe que ele foi projetado para eu apenas tentar fazê-lo funcionar; principalmente um trabalho de copiar / colar.

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
        include         /etc/nginx/mime.types;
        default_type    text/plain;
        include         /etc/nginx/conf.d/*.conf;
        server {
                listen          80;
                server_name     swingset.serverboy.net;

                access_log      /var/log/nginx/net.serverboy.swingset.access_log;
                error_log       /var/log/nginx/net.serverboy.swingset.error_log warn;

                root            /var/www/swingset;

                index           index.php index.html;
                fastcgi_index   index.php;

                location ~ \.php {
                        include /etc/nginx/fastcgi_params;
                        keepalive_timeout 0;
                        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                        fastcgi_pass    127.0.0.1:9000;
                }
        }
}
mattbasta
fonte

Respostas:

13

Adicione isso,

 location / {
                    try_files $uri $uri/ /index.php;
            }

O que ele faz é verificar primeiro a existência de $ uri e $ uri / como arquivos / pastas reais e, se eles não existirem, passarão por /index.php (essa é a minha configuração para o Zend Framework, onde o roteamento é feito através do índice .php) - é claro que se você precisar passar alguns parâmetros, basta anexar ao /index.php a? q = no final e ele passará os parâmetros.

Verifique se a diretiva try_file está disponível a partir da versão 0.7.27.

Adam Benayoun
fonte
7

Eu descobri por conta própria! sim!

Tudo que eu precisava para o locationbloco era:

location /  {
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_pass    127.0.0.1:9000;
}

Tudo o resto permaneceu praticamente o mesmo.

mattbasta
fonte
Você tentou o que escrevi abaixo? Também significa que todos os seus arquivos estáticos passarão pelo index.php - não tenho certeza se você quer isso.
Adam Benayoun
@ Adam: sim, eu tentei o seu código. Eu queria que tudo corresse através do index.php. Obrigado!
mattbasta
2

Para preservar os argumentos GET, use o seguinte:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

$ is_args se torna '?' se $ args não estiver vazio

Ou ainda mais simples:

location / {
    try_files /index.php$is_args$args;
}
Alexander Gavriliuk
fonte
1

Depois de definir o diretório raiz, adicione este

if (!-e $request_filename)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

De acordo com a sua necessidade, você pode alterar o regex conforme precisar governar query_string para index.php

Zhandos Zhandos Ulanuly
fonte
4
Existem maneiras melhores do ifque realizar o que ele está pedindo. wiki.nginx.org/IfIsEvil
Isius
0

Uma armadilha muito importante ter o cuidado de quando seu destino é um arquivo PHP é ter a certeza que quer return/ rewriteregra que uso não substituem a location ~ \.phpdirectiva. Se isso acontecer, o nginx servirá seu arquivo PHP sem renderizá-lo, revelando o código-fonte PHP. Isso pode ser catastrófico.

A maneira mais segura já é fornecida, location / { try_files $uri $uri/ /index.php; }

Certifique-se de definir também index index.phpno seu location /bloco e descomente o location ~ \.phpbloco incluído no arquivo de configuração padrão.

Luke Mlsna
fonte