考虑包含以下容器的dockerized环境:
我的nginx.conf包含以下内容:
server {
listen 8080;
location / {
auth_request /auth;
proxy_pass http://frontend:5000;
}
location = /auth {
proxy_pass http://auth:6000;
}
error_page 403 = @error403;
location @error403 {
rewrite ^ /login$1;
proxy_pass http://frontend:5000;
}
}
当auth_request /auth;
行被注释掉时,一切正常并且可以访问所有前端页面。
一旦我介绍auth_request
,我就可以看到验证服务返回403,但它看起来不像登录页面的Nginx代理。
我做错了什么?
答案 0 :(得分:0)
这里有两个问题:
首先,授权标头不会转发到身份验证服务。用
修复了这个问题location = /auth {
proxy_pass http://auth:6000;
proxy_pass_header Authorization;
}
其次,当向前端发出请求时,nginx会尝试使用auth
容器进行身份验证。由于我未经过身份验证,因此失败并返回403.然后,nginx服务器代理到REACT容器上的登录页面,但是,在幕后还有进一步的请求来检索css
和js
资源来自同一容器,nginx网关尝试进行身份验证。同样,由于我没有通过身份验证检索这些资源失败,因此页面无法呈现。
一个肮脏的解决方案是添加:
location /static/js/main.1e2389bc.js {
proxy_pass http://web:5000;
}
location /static/css/main.aa587518.css {
proxy_pass http://web:5000;
}
这将检索必要的文件以尝试进行身份验证来呈现登录页面。这是一个糟糕的解决方案,因为可能有其他资源(favicon,其他媒体等),因此需要添加更多的块。我确信有一个简单的解决方案,使用正则表达式以简单的方式对其进行排序。
然而,我最终得到了一个更清洁的解决方案。对后端API的请求进行身份验证。这确保了在未经过身份验证的情况下未在前端显示敏感信息,并消除了破解解决方案以呈现登录页面的麻烦。