Nginx 配置中,location 中有条件返回后如何继续?

Nginx 配置中,location 中有条件返回后如何继续?

我的服务器绑定了几个域名。

我需要将类似domain.com或的请求重定向domain.com/app.domain.com

以下是我在应用程序配置中添加的内容:

server {
   listen 80;
   server_name main_domain.com domain.com;

   ... other lengthy directives ...       

   location = / {
      if ($host ~ 'domain.com') {
          return 302, http://app.domain.com;
      }
   }

   location / {
       try_fies $uri @app;
   }

   location @app {
       include uwsgi_params;
       uwsgi_pass unix:path_to/uwsgi.sock;
       uwsgi_intercept_errors on;
   }
} 

这使得重定向有效,但对/我的其他域名的请求全部返回 404。

我该怎么做才能让 Nginx 运行到匹配的位置?

答案1

如果我正确理解了这个问题,那么目标是:

  • http://domain.com/-> 302 ->http://app.domain.com/
  • http://app.domain.com/-> @app 响应的静态文件
  • http://main_domain.com/-> @app 响应的静态文件
  • http://domain.com/something-> @app 响应的静态文件
  • http://app.domain.com/something-> @app 响应的静态文件
  • http://main_domain.com/something-> @app 响应的静态文件

(不确定为什么在配置中使用 main_domain 和 domain ;但问题中使用了 domain 和 app.domain - 如果您使用通配符 dns,则您当前依赖于隐式default_server)。

假设这是正确的:使用两个服务器块。

例如将所有这些放在一个文件中:

# /etc/nginx/common.conf
... other lengthy directives ...       

location / {
   try_fies $uri @app;
}

location @app {
   include uwsgi_params;
   uwsgi_pass unix:path_to/uwsgi.sock;
   uwsgi_intercept_errors on;
}

并将其包含在两个服务器块中:

server {
   listen 80;
   server_name domain.com;

   location = / {
      return 302 http://app.domain.com;
   }

   include common.conf;
}

server {
   listen 80;
   server_name main_domain.com app.domain.com;

   include common.conf;
}

这样就避免了使用 if 测试主机名,并且可以更清楚地了解每个主机将要发生什么。

答案2

如果我是你,我会稍微修改一下配置,以返回请求的 URI,但是在你想要重定向到的子域上,通过使用重写规则来执行此操作(你已经快到了);

server {
   listen 80;
   server_name main_domain.com domain.com;

      if ( $host = 'domain.com' ) {
          rewrite ^ http://app.domain.com$request_uri? permanent;
      }
} 

请注意,我已将其从您的location指令中删除(因此它适用于所有传入的 URI 请求)。

编辑:还请注意,我只是在假设您可能只想重写特定的 URL 的情况下留下了该if声明 - 如果不是这种情况,请将其放在rewrite这些服务器名称的配置主体中。

相关内容