我正在使用 Nginx 的 HTTP 基本身份验证,当我发送没有凭据的卷曲请求或无法在浏览器上提供凭据时,我会收到默认的 Nginx 401 错误页面,而不是我提供的自定义错误页面。 e40x.html 位于正确的位置,因为当我使用curl 发送 POST 请求时,我得到了自定义响应,因此我们可以忽略所有这些。
Nginx 用作 Docker 容器中运行的另一个应用程序的反向代理,但所有这些也可以忽略,因为它运行良好。请忽略除错误页面处理之外的所有内容。
我的 nginx.conf:
server {
listen 3000;
server_name .domain.com;
# Custom errors redirect
error_page 400 401 402 403 404 405 /e40x.html;
error_page 500 501 502 503 504 /e50x.html;
# Basic auth definition
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/conf/.htpasswd;
# Disable server tokens
server_tokens off;
more_set_headers 'Server: My-Value';
location / {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
limit_except GET {
deny all;
}
}
location /health {
auth_basic off;
proxy_pass http://localhost:3001/health;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
limit_except GET {
deny all;
}
}
# Custom errors definitions
location = /e50x.html {
root /etc/nginx/conf;
allow all;
internal;
}
location = /e40x.html {
root /etc/nginx/conf;
allow all;
internal;
}
# Security headers definition
add_header Content-Security-Policy "connect-src 'self' *.domain.com; font-src 'self' *.googleapis.com *.gstatic.com; frame-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' *.googleapis.com 'unsafe-inline'; frame-ancestors 'self'; img-src 'self' data: ; manifest-src 'self'; media-src 'self'; object-src 'self'; worker-src 'self';" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Content-Type-Options "nosniff";
add_header X-Frame-Options "DENY";
}
我尝试以多种方式解决这个问题,但我无法提供片段,因为所有这些尝试都使 nginx 失败,所以我没有保存它们。
首先我认为缩进一定有问题,但我不确定为什么 nginx 不提供我的自定义错误页面而不是默认的错误页面。
为此损失了几个小时后,我认为这与身份验证有关,但我不确定如何处理它。
我还尝试查找默认错误页面以编辑其中的内容,但我找不到它们。
我找到了解决办法。最终事情变得非常简单。 这确实是一个身份验证问题。 由于我无法通过身份验证,我收到了默认的 nginx 401 html 页面。
解决方案是将我的自定义错误页面的基本身份验证设置为关闭:
location = /e50x.html {
auth_basic off;
root /etc/nginx/conf;
allow all;
internal;
}
location = /e40x.html {
auth_basic off;
root /etc/nginx/conf;
allow all;
internal;
}