【问题标题】:nginx responds with 404 Not Found (Single Page App)nginx 以 404 Not Found(单页应用程序)响应
【发布时间】:2018-02-16 20:32:39
【问题描述】:

我有一个带有常规浏览器路由器(没有哈希)的单页应用程序。每当有人浏览页面并点击刷新按钮时,nginx 都会尝试在此路径上查找文件。因此,如果有人在 mypage.com/about 上,nginx 会查找 about 文件并以 404 Not Found 响应。如何解决这个问题?

我正在考虑使用通配符指定一个位置 - mypage.com/* 除了/api tho,因为此应用程序中的每个后端端点都以 api 开头。如何匹配除一个以外的所有路径?这是我的配置的样子:

upstream frontend {
    server frontend:3000;
}

upstream backend {
    server backend:8000;
}

server {
    listen 80;

    location /api {
        proxy_pass http://backend;
        proxy_set_header Host            \$http_host;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
    }

    location / {
        proxy_pass http://frontend;
        proxy_redirect default;
    }
}

【问题讨论】:

    标签: nginx server single-page-application


    【解决方案1】:

    为什么您的代理请求前端应用程序?我假设您正在使用某种开发服务器来为您的前端应用程序提供服务。最好将您的前端应用程序构建为静态文件并将它们作为常规静态文件提供,除了 nginx 之外没有任何服务器。

    至于您的问题,如果您将前端应用程序构建成静态文件,您可以像这样在 nginx 中配置位置:

    root /var/www/your_site;
    location / {
        try_files $uri /index.html;
    }
    

    其中 index.html 是应用程序的入口点,根路径应配置为存储位置。

    如果您仍想通过 nginx 从开发服务器为前端应用程序提供服务,您可以配置 nginx 以处理来自上游的错误并将错误页面指向开发服务器的根目录。

    在这种情况下,以下指令应该可以帮助您: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page

    【讨论】:

    • 我实际上是在使用 nginx 来提供这些静态文件。为前端代理请求是一种不好的做法吗?
    • 只用 nginx 提供静态文件就足够了。无需涉及任何其他服务器。
    • 哦,我这样做是因为我使用的是 docker 容器,而且在容器上公开一些端口要容易得多:) 否则我需要将整个前端构建复制到 nginx 容器中
    • @feerlay 你可以使用volumes。在这种情况下,您甚至不需要重新启动任何容器(或​​其中的服务器)来更新您的前端应用程序 - 只需更新挂载目录中的文件。
    • 哦,这真的很有趣 :) 去检查一下!
    猜你喜欢
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多