我的 nginx 设置需要将所有非/api/
请求定向到http://198.xxx.xxx.xx:8080/
。当我访问 时/
,一切正常。我可以访问前端提供的任何路由。但是,当我点击刷新时,找不到该路由。
我意识到我可以手动将每条路由添加到proxy_pass
根目录。显然这会很繁琐。肯定是配置我的 nginx 设置时出了错误或有更好的方法。
这是我的设置:
upstream app_server {
server unix:/var/run/unicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name xxxxxxxxxxxxxxxx.com;
location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|flv|mpeg|avi)$ {
try_files $uri @app;
}
location ^~ /api/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwaded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server/api/;
}
location /about {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://198.xxx.xxx.xx:8080/;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://198.xxx.xxx.xx:8080/;
}
}
当我访问/about
并刷新页面时,它会正确加载。但对任何其他路由(不包括 root/home)执行相同操作时,会出现空白页,并在我的服务器日志中显示为 404。我如何将所有非/api/
路径设置proxy_pass
为http://198.xxx.xxx.xx:8080/
?
答案1
我会尝试一些不同的方法:
upstream app_server {
server unix:/var/run/unicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name xxxxxxxx.com;
location / {
try_files $uri $uri/ @app;
}
location /api/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwaded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server/api;
}
location @app {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://198.xxx.xxx.xx:8080;
}
}
因此,我们在这里将“catch-all”块指定为@app,它将与任何文件系统文件不匹配的请求转发到198.xxx.xxx.xx:8080
。
然后我们有一个单独的location /api/
块,它匹配所有以 URI 开头的请求/api
。然后这些请求被代理到app_server
。