Nginx proxy_pass 所有非api路由

Nginx proxy_pass 所有非api路由

我的 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_passhttp://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

相关内容