我已经为我的服务器设置了静态错误页面,但我想忽略以 开头的 URL,/api/
以便那里的处理程序可以使用非 200 代码进行响应,但不返回静态错误页面。
现有的配置如下:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com;
root /var/www/html/;
index index.php;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_intercept_errors on;
fastcgi_index app.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 600;
}
error_page 404 /error/404.html;
error_page 500 502 503 504 /error/50x.html;
location ^~ /error/ {
root /usr/share/nginx/html/;
}
}
所以我想我需要添加一个新位置,例如:
location /api/ {
}
但我不知道该怎么告诉它不是遵循服务器的error_page规则。
答案1
好吧,我也遇到了同样的问题,但最终还是找到了解决方案。
就我所能达到的最高水平而言:
server {
include /etc/nginx/boilerplate/fancyerror_and_intercept.conf;
location ~ (?<target>.*) {
proxy_pass http://$backend;
}
}
/etc/nginx/boilerplate/fancyerror_and_intercept.conf
包含:
error_page 404 /40x.html;
error_page 403 /40x.html;
error_page 405 /40x.html;
error_page 500 /50x.html;
error_page 501 /50x.html;
error_page 502 /50x.html;
error_page 503 /50x.html;
location = /40x.html {
root /etc/nginx/error_pages;
}
location = /50x.html {
root /etc/nginx/error_pages;
}
more_set_headers -s '404 403 405 500 501 502 503 504' 'X-Robots-Tag: noindex, nofollow';
proxy_intercept_errors on;
为了排除/api/
路线(位置以 开头/api/
并且可以包含其后的任何内容),添加以下内容:
location ~ ^/api/ {
error_page 527 error.html;
proxy_intercept_errors off;
proxy_pass http://$backend;
}
本质上,该/api/
位置是一般位置的重复,但重新定义了 error_page 并将拦截错误设置为关闭。
这是有效的,因为Tim 之前曾说过,该error_page
指令会重置任何预定义的 error_pages。我选择了错误代码527
,因为我们不使用 CloudFlare参见维基百科,HTTP 状态代码列表#Cloudflare。由于我们proxy_pass
已请求,您的里程可能会有所不同,并且您可能需要将其更改proxy_intercept_errors off;
为fastcgi_intercept_errors off;
。
答案2
答案3
你可以使用这个:
location /api {
try_files $uri $uri/ /path/to/api/handler;
}
这样,nginx 将首先检查/api
目录下是否存在真实文件,如果没有找到匹配项,则将处理传递给您想要使用的处理程序。