Nginx+PHP-FPM:让php处理文件扩展名

Nginx+PHP-FPM:让php处理文件扩展名

我正在尝试提供一个处理一些 RESTful URI 的 PHP 脚本,并了解最终用户需要哪种格式的数据,我将其作为 URI 中的扩展进行处理,例如:

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

我在开发机器上使用 Apache httpd + modphp,它运行良好,但阶段服务器使用 CentOS + Nginx + PHP。在那里,nginx 拦截并尝试处理静态 json 文件并返回 404。

如何防止 Nginx 处理某些文件类型(例如 json、xml)并让 PHP 处理这些文件?

我的 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;
  }

}

更新:最终成功了,我将 json 相关位置放在主位置内,并将json 相关位置的/更改为静态脚本名称。感谢 Tim。$script_file_name

答案1

告诉 PHP 将对 json 文件的请求传递给 PHP 解释器。如果需要,您可以进行更精确的路径匹配,例如仅匹配“/api/scripts”目录中的 json 文件,您只需要计算出正则表达式即可。

将您的 PHP 位置更改为此

location ~ \.(php|json)$ {

相关内容