nginx 使用正则表达式嵌套位置

nginx 使用正则表达式嵌套位置

我尝试将 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/

希望它能给你一些提示来解决问题。

相关内容