我想在反向代理上为整个虚拟主机添加访问控制。我使用 nginx 子请求身份验证来执行此操作。预期的交互是用户将收到一条带有登录页面链接的错误消息,或者登录页面呈现在请求的 URL 上。登录过程完成后,应该有一些机制供用户导航/重新加载最初请求的 URL。反向代理本身没有脚本功能(即没有 PHP),这限制了通过身份验证过程捕获和传播原始 URL 的选项。
我的期望:如果请求身份验证失败(即http://authprovider.example.com:8081/gateway/index.php返回 401) 我希望在请求的 URL 处返回特定内容,无需重定向,并且具有 4xx 状态。
server {
listen 80;
server_name www.example.com;
root /var/www/html;
error_page 401 iprestricted.html;
## This provides feedback to the user when request is disallowed
## (including a link to login)
# location /iprestricted.html {
# try_files $uri $uri/ =404;
# }
# This implements the sub-request check....
location /restricted {
internal;
proxy_pass http://authprovider.example.com:8081/gateway/index.php ;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Original-URI $request_uri;
}
location / {
auth_request /restricted;
proxy_pass http://localwebserver/;
}
}
然而:
如果location /iprestricted.html{...}
注释掉,我会得到一个重定向循环http://www.example.com
如果取消注释,则任何请求都会得到 302 响应,其中 Location /iprestricted.html 返回 200 状态代码
如何实现不带重定向的子请求身份验证?
是否有其他方法可以捕获原始 URL 并仅使用 nginx 配置将其传播到身份验证步骤?
我确实尝试添加add_header WWW-Authenticate "Basic realm=bipdevtest";
上述每个位置,但这并未在 HTTP 响应中发回。
答案1
总是一个好主意阅读手册
如果 auth_request 提供程序返回 WWW-Authenticate 标头,Nginx 将中继该标头(http://authprovider.example.com:8081/gateway/index.php在上述内容中)。
然而,我将保留这个问题,因为我对自定义错误页面导致 302 重定向然后是 200 响应感到困惑/担心。