nginx - 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 文档所说的那样行事。
有任何想法吗?
解决方案
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
可以简化,捕获是不必要的。
推荐阅读
- regex - 为什么 perl 正则表达式挂起?
- java - 如何更改 RMI 侦听积压大小?
- elasticsearch - elasticsearch在properties字段多时存储时间序列数据(约60000个字段)
- oracle - 在 Oracle 中将 Linq2Db 设置为使用 CHAR 类型和 NOT NULL 约束读取和更新
- kubernetes - 服务“kube-dns”无效:spec.clusterIP:无效值:“10.10.0.10”:字段不可变
- karate - 后台操作失败时将场景测试标记为已跳过
- react-native - 将通知深度链接延迟到完全加载 react-native expo 应用程序之后
- node.js - 将 TFS2017 任务更新到最新版本
- python - 无法在python中将数据发送到特定的websocket客户端
- angular - Ionic4 ion-slide,循环配置打开时不工作的属性