我在尝试在 Nginx 中设置位置块时遇到了麻烦。我的服务器中有三个项目/目录,我想在同一个域下提供服务。两个 React 服务器和一个 NodeJS 服务器。
我想要实现的目标是:
- 如果转到域根目录,我想为其中一个 React 应用提供服务。因此,由于项目已构建,因此这只是静态文件。(这运行良好)
- 如果
/check
我想将其传递给 nodeJS 应用程序(这也很好用) - 接下来是棘手的部分。我希望
/check
除根域之外的所有其他内容都能加载其他 React 应用程序。(这不起作用)
这是我目前拥有的:
server {
root /var/www/landing/public;
index index.html index.htm index.nginx-debian.html;
server_name domain.com www.domain.com;
location / {
try_files $uri $uri/ =404;
}
location /(?<something>.*)/ {
alias /var/www/react-frontend/build/;
index index.html index.htm;
}
location /check/ {
proxy_pass http://localhost:3001/;
}
}
希望我能够解释清楚一切。谢谢。
答案1
以下是示例配置。
server {
listen 127.0.0.1:8088;
location / {
content_by_lua_block {
ngx.say("root")
ngx.exit(ngx.HTTP_OK)
}
}
location ~* "^\/check(.*)$" {
content_by_lua_block {
ngx.say("check")
ngx.exit(ngx.HTTP_OK)
}
}
location ~* "^\/(.*)\/+(.*)$" {
content_by_lua_block {
ngx.say("all other")
ngx.exit(ngx.HTTP_OK)
}
}
}
以下是测试:
# curl 127.0.0.1:8088
root
# curl 127.0.0.1:8088/
root
# curl 127.0.0.1:8088/ll
root
# curl 127.0.0.1:8088/ll/
all other
# curl 127.0.0.1:8088/check
check
# curl 127.0.0.1:8088/check/
check
答案2
我相信你可以做这样的事情:
location = / {
index block
}
location = /check/ {
check block }
location ~* ".*" {
all others block
}
因为精确匹配优先于正则表达式匹配。这对你有用吗?