我正在尝试提供一个处理一些 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)$ {