如何使用 nginx conf 进行 if/else 语句?

如何使用 nginx conf 进行 if/else 语句?

使用 nginx 可以做这样的事情吗?

if ( $http_user_agent = "wget" ){
   server {
      listen      192.0.2.11:1111;
      root        /website1/;
      server_name website1.example www.website1.example;
else 

   server {
      listen      192.0.2.22:22222;
      root        /website2/;
      server_name example2.example www.website2.example;
}

答案1

Nginx 重写模块确实有if指示(请参阅链接文档中的示例),但不是else。 的等效项else将是所有没有被修改的if

您可以if在 a 内部使用server { },但不能反过来。在已经需要服务器的请求之前,您甚至不会在 if 中比较条件。在那里,您只能在用户代理为(或不是)时提供内容wget

还请注意,你不应该使用ifinside,location因为它可能无法按预期工作(请参阅如果是邪恶的)。

答案2

以下是我认为您正在寻找的方法。我知道这已经是几年前的事情了,但我一直在寻找类似的东西,希望这对将来的某人有所帮助。

map $http_user_agent  $user_agent {
    default all;
    wget    wget;
}

server {
  listen 123;
  location / {
    proxy_pass http://$user_agent;
  }
}

upstream wget {
    server 127.0.0.1:1111;
}

upstream all {
    server 127.0.0.1:22222;
}

server {
    listen      127.0.0.1:1111;
    root        /website1/;
    server_name example.com www.example.com;
}

server {
    listen      127.0.0.1:22222;
    root        /website2/;
    server_name example2.com www.example2.com;
}

答案3

在给定的形式下,它将不起作用:测试 HTTP User-Agent 意味着请求已被接收。这只有在server已定义某些块的情况下才有可能。您真的想根据在其他地方收到的请求的 User-Agent 字符串来启动新服务器吗?

如果你只是想根据请求的各个部分(例如 User-Agent)提供不同的内容、重定向到不同的路径等,这是可能的,例如http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

相关内容