我尝试将 HTTP 身份验证应用于我的网站的大部分内容,但主页、路径/welcome
和单独的 /admin/、/services/ 和 /stats/ 部分除外。
我似乎没有正确执行此操作;这是我当前的配置:
location ~ ^/(admin|services|stats)/ { # L1
# don't need http auth at this path as there is separate auth
proxy_pass http://myapp-admin-cluster;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
location / { #L2
location ~ /(?!welcome).+ { #L3
auth_basic "MyApp";
auth_basic_user_file /var/www/myapp/htpasswd;
}
proxy_pass http://myapp-web-cluster;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
问题是,如果我导航到,/admin/
我会得到 HTTP 404,而不是将我的请求转发到 myapp-admin-cluster 代理(并且它也不会被转发到 myapp-web-cluster 代理)。
Q1:为什么 L2 主体中定义的代理设置不适用于与 L3 匹配的路径?
问题 2:为什么嵌套位置 L3 会覆盖 L1?它们都是正则表达式匹配,所以它肯定应该匹配第一个?引用 nginx 文档:“然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一个匹配时终止”
答案1
因为基本上地点 /将匹配任何 url 模式,因此当您无法匹配管理字符串时,您将匹配 / 块下的规则。
从规则 L3 开始,匹配除匹配之外的所有页面/欢迎,因此您将被重定向以执行基本身份验证。
更新:
由于作者更新了他的问题,位置块也应该更新,而且我还怀疑 Nginx 找不到重定向时应该显示哪个文件,我建议放一个索引部分也:
location ~* ^/(admin|services|stats)/ {
index index.html;
...
由于您正在使用 url 进行代理,因此您需要在http://myapp-admin-cluster
例如,我们有以下 URL:
http://<your_webserver_IP or DNS>/admin/1.html
您将被重定向至:
http://myapp-admin-cluster/admin/1.html
但不是:
http://myapp-admin-cluster/
希望它能给你一些提示来解决问题。