【问题标题】:nginx route all except a few to foldernginx将除少数之外的所有路由到文件夹
【发布时间】:2019-07-16 02:01:46
【问题描述】:

我的 nginx 配置如下:

server {
    listen 80;
    server_name bla;

    location /api {
      include uwsgi_params;
      uwsgi_read_timeout 600;
      uwsgi_pass unix:/var/www/html/site.sock;
    }

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

基本上我有一个 Vue 前端和一个 Flask/uWSGI 后端。所有后端请求 (/api) 都包含在第一个位置规则中。所有的前端请求都被第二个覆盖了。效果很好。

我想要做的是对少数没有前缀 api/ 的路由有一个例外,它们被转发到后端而不是前端。

例如,我希望能够将/this-is-an-api-request 发送到后端,而不是转发到 index.html。我不能使用重定向,因为有一些 POST 请求并且我无法成功重定向这些请求。

【问题讨论】:

  • 您是否尝试过简单地将 api 位置块与其他路径复制? location /this-is-an-api-request { 与 api 位置块内容相同 }
  • POST 请求可以使用return 307 重定向。是否有足够的特殊 URI 来证明使用 map 是合理的?
  • 307 重定向由于某种原因无法正常工作。对于该路线的每种类型的请求,我一直在获取不允许的方法。 @mjb2kmn 的解决方案奏效了。

标签: nginx redirect server webserver url-redirection


【解决方案1】:

您可以使用error_page 将所有导致 404 错误的请求转发到后端 (docs)。

server {
    listen 80;
    server_name bla;

    location /api {
        include uwsgi_params;
        uwsgi_read_timeout 600;
        uwsgi_pass unix:/var/www/html/site.sock;
    }

    location / {
        error_page 404 = @error;
        root /var/www/html;
    }

    location @error {
        include uwsgi_params;
        uwsgi_read_timeout 600;
        uwsgi_pass unix:/var/www/html/site.sock;
    }
}

【讨论】:

  • 该位置不会生成 404 响应。请参阅try_files 声明。
  • 谢谢。没注意到,抱歉。我在没有try_files 的情况下对其进行了测试。我更新了我的答案。
  • 您可以使用try_files $uri $uri/ @error;,而不是使用error_page 404。但无论哪种情况,它仍然会破坏 OP 的前端路由器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2020-12-29
  • 2013-07-25
  • 2020-07-23
相关资源
最近更新 更多