Como faço para o Nginx redirecionar todos os pedidos de arquivos que não existem para um único arquivo php?

6

Eu tenho a seguinte configuração do vgin do nginx:

server {
    listen 80 default_server;

    access_log /path/to/site/dir/logs/access.log;
    error_log /path/to/site/dir/logs/error.log;

    root /path/to/site/dir/webroot;
    index index.php index.html;

    try_files $uri /index.php;

    location ~ \.php$ {
            if (!-f $request_filename) {
                    return 404;
            }

            fastcgi_pass localhost:9000;
            fastcgi_param SCRIPT_FILENAME /path/to/site/dir/webroot$fastcgi_script_name;
            include /path/to/nginx/conf/fastcgi_params;
    }
}

Eu quero redirecionar todas as solicitações que não correspondem aos arquivos que existem para index.php. Isso funciona bem para a maioria dos URIs no momento, por exemplo:

example.com/asd
example.com/asd/123/1.txt

Nenhum de asd ou asd/123/1.txt existe, portanto eles são redirecionados para index.php e isso funciona bem. No entanto, se eu colocar o url example.com/asd.php , ele tentará procurar asd.php e, quando não puder encontrá-lo, retornará 404 em vez de enviar a solicitação para index.php .

Existe uma maneira de enviar também asd.php para index.php se asd.php não existir?

    
por Richard 05.01.2011 / 15:33

7 respostas

10

Por seus comentários adicionais, isso parece ser a maneira mais ideal, embora não seja uma configuração bonita.

server {
    listen 80 default_server;

    access_log /path/to/site/dir/logs/access.log;
    error_log /path/to/site/dir/logs/error.log;

    root /path/to/site/dir/webroot;
    index index.php index.html;

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

    location ~ \.php$ {
        try_files $uri @missing;

        fastcgi_pass localhost:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /path/to/nginx/conf/fastcgi_params;
    }

    location @missing {
        rewrite ^ /error/404 break;

        fastcgi_pass localhost:9000;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        include /path/to/nginx/conf/fastcgi_params;
    }
}
    
por 05.01.2011 / 18:59
3

Uau, acho que tudo o que você quer substituir é:

error_page 404 /index.php

... se eu ler o que você quer corretamente.

    
por 05.01.2011 / 16:08
2

O que você está tentando fazer é o mesmo que a página de erro personalizada. Você pode usar a propriedade error_page do nginx para conseguir isso. Siga o link para mais informações

link

    
por 05.01.2011 / 16:08
1

Acho que o problema é que você está usando "try_files" junto com uma instrução "if" em seu local. A partir da documentação, try_files deve ser um substituto para if e mod_rewrite style exist check. No wiki nginx, a página "try_files" ( link ):

"try_files é basicamente um substituto para a típica verificação de existência de arquivo / diretório do estilo mod_rewrite. É suposto ser mais eficiente do que usar if - veja IfIsEvil"

Verifique a página wiki "if" ( link ):

"note: Antes de usar, por favor, veja a página" o que é mal "e considere o uso de" try_files "."

Então, tente remover isso se verificar e apenas ficar com o "try_files". Isso deve verificar a existência de qualquer página (incluindo asd.php ou qualquer outra coisa que esteja em .php) e retornar ao index.php, se não encontrar o arquivo.

    
por 05.01.2011 / 16:19
0

Trabalhou comigo!

    location /anyfolder {
        error_page 404 /yourhandler.php?fnf=$uri;
    } 
    
por 27.07.2015 / 06:06
0

Richard, de acordo com o guia Pitfalls, é recomendado definir “cgi.fix_pathinfo = 0 ″ no php.ini, pois ele resolve um potencial vulnerabilidade entre nginx e php.

    
por 09.01.2011 / 18:47
0

Eu quero redirecionar todos os arquivos php ausentes para a página de erro /error404 interna personalizada. Vou postar minha solução encontrada durante a permutação.

error_page 404 /error404;

não me ajudou. Nem as combinações de location , @missing , rewrite e break . Mas

location ~ \.php$ {
    # this is it! $fastcgi_script_name points to my url
    try_files $fastcgi_script_name = /error404; 
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
    ...
    etc.
    
por 02.02.2017 / 15:00