我正在尝试处理一些处理一些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处理某些文件types(例如,json,xml)并让PHP处理这些?
我的Nginxconfiguration:
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; } }
告诉PHP将json文件的请求传递给PHP解释器。 如果需要,可以进行更精确的path匹配,例如“/ api / scripts”目录中只有json文件,您只需要计算正则expression式即可。
将您的PHP位置更改为此
location ~ \.(php|json)$ {