![如何关闭特定路径的 fastcgi_intercept_errors](https://linux22.com/image/708966/%E5%A6%82%E4%BD%95%E5%85%B3%E9%97%AD%E7%89%B9%E5%AE%9A%E8%B7%AF%E5%BE%84%E7%9A%84%20fastcgi_intercept_errors.png)
我刚刚为我新创建的炫酷网站创建了一个 API,并希望返回带有相关状态代码的错误响应。但是,我已经配置了正常路径以使用带有指令的错误页面,error_page
我不想删除该指令。
我有一个 index.php 文件来处理对 API 和网站的所有请求。
server {
listen 80;
listen 443 ssl http2;
server_name ~^(.+)\.flashy\.local$;
root "/home/vagrant/flashy/core/www";
index index.html index.htm index.php;
charset utf-8;
error_page 400 /error/error-400.html;
error_page 403 /error/error-403.html;
error_page 404 /error/error-404.html;
error_page 500 501 /error/error-500.html;
error_page 502 503 504 /error/error-503.html;
location ~ ^/error/error-(403|404|500|503)\.html$ {
internal;
root /home/vagrant/flashy;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_intercept_errors on;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
access_log off;
error_log /var/log/nginx/~^(.+)\.flashy\.local$-error.log error;
sendfile off;
client_max_body_size 100m;
location ~ /\.ht {
deny all;
}
ssl_certificate /etc/nginx/ssl/~^(.+)\.flashy\.local$.crt;
ssl_certificate_key /etc/nginx/ssl/~^(.+)\.flashy\.local$.key;
}
现在,你们中有些人可能会想?我尝试了什么?
我尝试添加一个/api/
位置来将fastcgi_intercept_errors
参数更改为关闭,但它似乎又被设置回打开状态,因为它无论如何都会击中一个 php 文件。
location /api/ {
fastcgi_intercept_errors off;
try_files $uri $uri/ /index.php?$query_string;
}
我还尝试了 if 语句,看看是否可以根据内容标题进行匹配。但是,如果可能的话,我不想使用 if 语句,因为这似乎是个坏主意。
...
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
if ($content_type != "application/json") {
fastcgi_intercept_errors on;
}
}
...
我的问题与这问题,但也没有答案。希望我的问题略有不同,也许有更好的解释?
如何关闭特定 api 路径的 fastcgi_intercept_errors?
答案1
您需要在新的location
API URI 中复制 FastCGI 配置。大多数fastcgi
指令可以移入块中,并将由块和新块server
继承。请参阅location ~ \.php$
location
这个文件了解详情。
完全匹配location
块具有最高优先级,因此本例中的块顺序并不重要(参见这个文件详情请见):
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
location = /api/api.php {
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
fastcgi_intercept_errors on;
}
fastcgi_split_path_info
和指令fastcgi_index
与您的配置无关。