Nginx - Encaminha todos os pedidos para um único script

10

Eu tenho um script PHP que lida com roteamento de script e faz todo tipo de coisas extravagantes. Ele foi originalmente projetado para o Apache, mas estou tentando migrá-lo para o nginx em algumas das minhas caixas. No momento, estou tentando suavizar 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 arquivo .htaccess . Aqui está o que parece:

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

bastante simples. Todas as solicitações são executadas em index.php , simples e simples.

Estou tentando imitar esse comportamento no nginx, mas ainda não encontrei um jeito. Alguém tem alguma sugestão?

Aqui está uma cópia do meu arquivo nginx.conf no momento. Note que 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;
                }
        }
}
    
por mattbasta 15.08.2010 / 00:55

4 respostas

4

Eu descobri por conta própria! Sim!

Tudo o que eu precisava para o bloco location 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 basicamente o mesmo.

    
por 16.08.2010 / 09:59
13

Adicione isto,

 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, irá apenas através de /index.php (essa é a minha configuração para o Zend framework onde o roteamento é done through index.php) - claro que se você precisar passar alguns parâmetros, basta anexar o /index.php a? q = no final e ele passará os parâmetros.

Certifique-se de que a diretiva try_file esteja disponível na versão 0.7.27 e posteriores.

    
por 15.08.2010 / 01:06
1

Depois de definir o diretório raiz, adicione isto

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

De acordo com a sua necessidade, você pode alterar o regex, já que precisa governar query_string para index.php

    
por 12.03.2012 / 10:17
0

Uma armadilha muito importante para se ter cuidado quando o seu alvo é um arquivo PHP é certificar-se de que a regra return / rewrite que você usa não supere a diretiva location ~ \.php . Se isso acontecer, o nginx servirá seu arquivo PHP sem renderizá-lo, revelando o código fonte do PHP. Isso pode ser catastrófico.

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

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

    
por 31.07.2017 / 00:39

Tags