Nginx + PHP-FPM: Deixe o php lidar com extensões de arquivo

1

Eu estou tentando servir um script PHP que lida com alguns URIs RESTful e para saber qual formato o usuário final precisa de dados, lidei com isso como a extensão no URI, por exemplo:

example.com/foo/bar.json?q=x&a=y --> data in ajax format
example.org/foo/bar.xml?q=x&a=y  --> data in xml format

Eu uso o Apache httpd + modphp na minha máquina de desenvolvimento e ele funciona muito bem, mas o servidor de estágio usa o CentOS + Nginx + PHP. Lá, o nginx intercepta e tenta manipular um arquivo json estático e retorna 404.

Como posso evitar que o Nginx manipule certos tipos de arquivos (por exemplo, json, xml) e deixe o PHP lidar com eles?

Configuração do meu Nginx:

server {

  # listen [::]:443 ssl http2 accept_filter=dataready;  # for FreeBSD
  # listen 443 ssl http2 accept_filter=dataready;  # for FreeBSD
  # listen [::]:443 ssl http2 deferred;  # for Linux
  # listen 443 ssl http2 deferred;  # for Linux
  listen [::]:443 ssl http2;
  listen 443 ssl http2;

  # The host name to respond to
  server_name example.com;

  include h5bp/directive-only/ssl.conf;
  include ssl/conf/example.com;

  # Path for static files
  root /var/www/example.com/app/public;
  index index.php index.html index.htm;

  #Specify a charset
  charset utf-8;

  # Custom 404 page
  error_page 404 /404.html;

  # Include the basic h5bp config set
  include h5bp/basic.conf;

  # log settings
  access_log off;
  error_log  /var/log/www/example.com/nginx/error/error.log error;

  # turn off access logs and prevents logging
  # an error if robots.txt and favicon.ico are not found
  location = /favicon.ico { access_log off; log_not_found off; }
  location = /robots.txt  { access_log off; log_not_found off; }


  # check if a file or directory index file exists,
  # else pass the request to the index.php as a query parameter.
  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  # handle execution of PHP files
  # set php5-fpm socket
  # tell NGINX to proxy requests to PHP FPM via the FCGI protocol
  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass localhost:9003;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_intercept_errors off;
    fastcgi_buffer_size 16k;
    fastcgi_buffers 4 16k;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
  }

  # block access to .htaccess files
  location ~ /\.ht {
    deny all;
  }

}
    
por Cunning 23.02.2017 / 03:59

1 resposta

0

Diga ao PHP para passar solicitações de arquivos json para o interpretador PHP. Você pode fazer correspondências de caminho mais precisas, se necessário, por exemplo, apenas arquivos json no diretório "/ api / scripts", você só precisa trabalhar com a expressão regular.

Mude sua localização do PHP para esta

location ~ \.(php|json)$ {
    
por 23.02.2017 / 04:06