Reescrevendo try_files do nginx


8

Estou tentando converter uma reescrita muito simples de uma versão anterior do nginx para a atual, como abaixo:

location / {
   if ( !-f $request_filename ) {
     rewrite ^/([a-z]*)$ /index.php?action=$1;
     rewrite ^/([a-z]*)/(.*)$ /index.php?action=$1&item=$2;
   }
}

Foi assim que cheguei. A página de índice aparece, mas qualquer página que deve ser reescrita como acima, em vez disso, lança 404:

server {

    listen 80 default;
    root /var/www;
    index index.php;
    server_name _;

    location / {
        try_files $uri $uri/ /index.php?action=$uri&item=$args;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

O que eu estou fazendo errado aqui?


O que está acontecendo exatamente? Parte do problema é $ uri e $ args não são codificados corretamente.
Lucas

404 é jogado com File not found. se eu usar URI /pageou/page/id
Industrial

O que acontece quando você faz exatamente try_files $uri $uri/ /index.php?
Lucas

O Index.php funciona bem, mas qualquer coisa que deva ser reescrita acaba nos 404's
Industrial

Tente try_files $uri $uri/ /index.php?$args. Você deve conseguir o URL com $_SERVER['REQUEST_URI']. $ _GET deve funcionar normalmente.
Lucas

Respostas:


9

Isso deve funcionar:

location / { 
    try_files $uri $uri/ @rules; 
} 

location @rules { 
    rewrite ^/([a-z]*)$ /index.php?action=$1; 
    rewrite ^/([a-z]*)/(.*)$ /index.php?action=$1&item=$2; 
}

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

Hmm. No seu primeiro exemplo, o index.php será carregado, mas todos os arquivos estáticos ou solicitações de URI como /page1/itemos retornarão o index.php
Industrial

Isso é estranho. try_files deve cuidar disso.
Lucas

Tentei o segundo exemplo também. Mesmo problema lá
Industrial

Estou assumindo que try_files $uri $uri/trabalha com arquivos estáticos?
Lucas

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.