Nginx serve arquivo simples se existe serve /index.php

2

Eu quero que o Nginx atenda a qualquer solicitação de arquivos estáticos, mas se o arquivo não existir, então, atenda o index.php, que tratará de todos os arquivos

Atualmente, minha configuração é assim,

server {
listen 80;
listen [::]:80;

root /home/www/example.com/htdocs;

index index.php;

server_name www.example.com;


location ~* ^[^\?\&]+\.(html|jpg|jpeg|json|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|svg|woff|ttf)$ {
    # First attempt to serve request as file, then
    # as directory, then fall back to index.php
    try_files $uri $uri/ /index.php;
    #try_files /favicon.ico =404;
}


location / {
    add_header X-Is-PHP true;
            try_files /index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
    }


}

Isso é o mais próximo que posso chegar, ele atende a qualquer solicitação de arquivos estáticos e, se não existir, serve index.php como um arquivo de texto simples. Como posso obter o index.php passado para o interpretador PHP?

    
por John Cave 24.01.2016 / 05:04

3 respostas

2

tente isso

server {
listen 80;
listen [::]:80;

root /home/www/example.com/htdocs;

index index.php;

server_name www.example.com;


location ~* ^[^\?\&]+\.(html|jpg|jpeg|json|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|svg|woff|ttf)$ {
    # First attempt to serve request as file, then
    # as directory, then fall back to index.php
    try_files $uri $uri/ /index.php;
    #try_files /favicon.ico =404;
}

error_page 404 /index.php;

location ~ \.php$ {
            add_header X-Is-PHP true;
            #try_files $uri =404;
            try_files /index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
    }


}

alterações

1) Adicionado error_page 404 /index.php; para que todos os pedidos não encontrados no servidor sejam redirecionados para index.php

2) Adicionado "~ .php $" ao atributo de localização.

3) Se você quiser que outros arquivos PHP também sejam interpretados, descomente a linha "#try_files $ uri = 404;" e comente a linha "try_files /index.php = 404;"

    
por 25.01.2016 / 06:03
1

location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php; } }

    
por 24.01.2016 / 12:09
0

Para ser honesto, você NÃO deveria estar usando o If. Isso é mencionado no manual do NGINX em seu site. Uma ótima maneira de conseguir servir um arquivo, se existir, é usar try_files corretamente. Aqui está o exemplo que eu forneci abaixo.

set $base_root /webhosts/website.com/webroot;
root $base_root;

#if file exists then serve it. Else Fallback to @php location directive
location / {
    try_files $uri $uri/ @php;
}

location @php { 
    rewrite ^/(.+)$ /index.php?/$1 last;
}

O exemplo acima está apenas usando uma regra de reescrita que eu preciso. Você deve usar try_files e deixar o terceiro argumento (diretiva Fallback) determinar o que acontece a seguir.

Certifique-se também de definir a raiz. Se você definir root para / então isso é muito perigoso porque você abre a raiz do sistema para arquivos que você não deveria.

    
por 25.04.2018 / 23:19

Tags