首页 > 解决方案 > Nginx 位置匹配规则有什么问题

问题描述

我确实阅读了有关位置匹配的 Nginx 文档。我知道修饰符的优先级。

这是我的配置。

    location = /login {
        root  /usr/share/nginx/mysite;
        try_files $uri /index.html;
    }

    location = / {
        root  /usr/share/nginx/mysite;
        try_files $uri /index.html;
    }

    location ~ /(.*) {
        proxy_pass http://127.0.0.1:8080/$1;
    }

我想要的是当我输入 "http://example.com/" "http://example.com/login" 时,请求将进入 index.html 这是一个 React App ,其他请求将通过代理传递给我绑定 8080 端口的 Tomcat 应用程序。

但是 "http://example.com/" "http://example.com/login" 请求通过 proxy_pass ,什么?

根据 Nginx 文档,“=”修饰符是“优先级”,我希望它是完全匹配的。

如果找到完全匹配,则搜索终止

我也使用https://nginx.viraptor.info/测试它。

它显示了我的预期。

但看起来正在运行的服务器没有按照 Nginx 文档所说的那样行事。

有任何想法吗?

标签: nginx

解决方案


try_files语句的最后一个参数是特殊的。它可以是状态代码、命名位置或内部重定向的 URI。有关详细信息,请参阅此文档

在您当前的配置中,Nginx 会生成一个内部重定向/index.html并重新开始搜索匹配的location. 所以/index.html请求被发送到proxy_pass.

放在/index.html最后一个参数之前,以便将其解释为文件参数并在同location一块内处理。在这种$uri特殊情况下是不必要的。

例如:

root  /usr/share/nginx/mysite;

location = /login {
    try_files /index.html =404;
}
location = / {
    try_files /index.html =404;
}
location / {
    proxy_pass http://127.0.0.1:8080;
}

=404永远达不到。最后location可以简化,捕获是不必要的。


推荐阅读