我在 Kibana 的 nginx 配置中有以下两个块。我的目标是提供两个级别的访问权限,一个用于访问 Kibana 的仪表板、可视化和发现页面(适用于开发人员),第二个级别可以访问管理和开发工具(适用于 Elasticsearch 管理员)。
server {
listen 80;
server_name elk.ops.example.com;
location ~* "(app\/.*\#\/management.*|app\/timelion.*|app\/.*\#\/dev_tools.*)"
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/htpasswd.admin;
proxy_pass http://localhost:5601;
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;
}
location / {
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/htpasswd.users;
proxy_pass http://localhost:5601;
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;
}
}
当我使用此配置运行时,http://elk.ops.example.com/app/timelion
未经授权的用户访问时会正确导致 403 Forbidden,但是http://elk.ops.example.com/app/kibana#/management?_g=()
和http://elk.ops.example.com/app/kibana#/dev_tools/console?_g=()
仍然可以访问。
我尝试了各种方式的正则表达式过滤器来限制第一个位置块中的这两条路径,但都失败了。我很清楚问题出在 URL 中的 # 上,nginx 中的 # 是否有什么特殊之处导致了问题?
答案1
之所以不起作用,是因为#
字符从未发送到服务器。不幸的是,使用 nginx 无法解决这个问题。