nginx中IF语句的语法

时间:2015-09-28 14:37:33

标签: nginx syntax url-rewriting reverse-proxy

我在nginx.conf文件中有两个不同的server_name:
第一个是:

server_name ~^(?<subdomain>.+)\.nithinveer\.com$;
    location /
            {
                    proxy_pass http://192.168.6.190/Profiles/$subdomain/default.aspx$request_uri/;
                    access_log /var/log/nginx/true.log;
            }

另一个

server_name ~^(?<subdomain>.+)\.nithinveer\.com\.(?<extension>)$;
            location /extension 
            {
                    proxy_pass      http://192.168.6.190;
                    access_log /var/log/nginx/false.log;
            }

现在问题是我想要使用server_name中的server_name。如果server_name没有扩展名,则应该转到第一个位置。如果有扩展名,则应转到第二个位置 但是在运行nginx时,它并没有进入第二个server_name 任何人都可以为此找到一些解决方案......? 我认为解决方案(可能是错误的)。

server_name ~^(?<subdomain>.+)\.nithinveer\.com\.(?<extension>.+)$;
            if($<extension> == NULL)
             {
                   location /
                        {
                    proxy_pass http://192.168.6.190/Profiles/$subdomain/default.aspx$request_uri/;
                    access_log /var/log/nginx/true.log;
                         }
              }
              else
            {       location /
                        {
                          proxy_pass      http://192.168.6.190;
                          access_log /var/log/nginx/false.log;
            }

但if语句的语法会引发错误。

1 个答案:

答案 0 :(得分:1)

nginx中没有 else 指令。 此外,您也不需要复制该位置。

试试这个:

server {
    server_name ~^(?<subdomain>.+).nithinveer\.com(?<extension>\..+)$;

    location / {
            This will match hosts terminating with ".com"
            if ($extension = "")
              {
                proxy_pass http://192.168.6.190/Profiles/$subdomain/default.aspx$request_uri/;
                access_log /var/log/nginx/true.log;
              } 

            This will match hosts with something after ".com", e.g: "foo.nithinveer.com.me", the $extension will be ".me"
            if ($extension != "")
              {                    
                proxy_pass      http://192.168.6.190;
                access_log /var/log/nginx/false.log;
              }                

          }
}

另外,请考虑if is evil

这是使用安全的版本:

server_name ~^(?<subdomain>.+).nithinveer\.com(?<extension>\..+)$;
    location / {
        error_page 418 = @with_extension;

        #This will match hosts with something after ".com", 
        # e.g: "foo.nithinveer.com.me", the $extension will be ".me"
        if ($extension != "")
          {                    
            return 418;
          }                

        #  This will match hosts terminating with ".com"       
        proxy_pass http://192.168.6.190/Profiles/$subdomain/default.aspx$request_uri/;
        access_log /var/log/nginx/true.log;

      }

    location @with_extension {        
        proxy_pass      http://192.168.6.190;
        access_log /var/log/nginx/false.log;  
    }