2016-09-30 95 views
0

所以,这是我的情况。我有一个网站有一些自定义逻辑来自一个单独的上游应用程序。我现在有这个工作没有问题,尽管我的直接解决方案有点冗长。我将很快添加更多这些自定义位置,并添加以大写和小写方式访问这些位置的功能。我的解决方案将起作用,但地点列表很快就会变得笨拙,我想重新考虑我的解决方案。Nginx规则的大小写位置

因此,我们假设我的上游文件被称为“myupstream”,并已在文件中定义。我的自定义位置将是一,二,三和四。 (真实位置名称因其自身保护而更改)。

所以这些URL:

http://mysite/one http://mysite/two http://mysite/three http://mysite/four

在我的nginx.conf:

location /one { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/one; 
      proxy_set_header Host $http_host; 
    } 
    location /two { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/two; 
      proxy_set_header Host $http_host; 
    } 
… 
etc. 

所有的位置是除了位置的名称相同。

现在,位置的数量是现在的几个,但可能会增长到几十个。然后,添加以大写和小写访问位置的功能。所以:

http://mysite/one http://mysite/ONE http://mysite/two http://mysite/TWO 等等

如果我有20个地点,使用我目前的战略我要创建我的nginx.conf里面40点不同位置的块。所以,我正在寻找一种更有活力的方式。有些事情是这样的:

location /(one|two|three) { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/$1; 
      proxy_set_header Host $http_host; 
    } 

当然,我希望它只适用于特定的条目,所以一个宽敞的规则是行不通的。另外,我也想检测大写字母,但在调用上游时,它需要小写。例如:

location /ONE { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/one; 
      proxy_set_header Host $http_host; 
    } 

所以问题1:

有没有更好的方式nginx的做到这一点?怎么样?

问题2:

哪种方式更具资源/流程效率?

在此先感谢您。

回答

2

使用不区分大小写的location匹配:

location ~* /(one|two|three) { 
    log_request_speed_filter on; 
    log_request_speed_filter_timeout 1000; 
    proxy_pass http://myupstream/$1; 
    proxy_set_header Host $http_host; 
} 

还有一个办法 - 使用模板:

/etc/nginx/host.tmpl

log_request_speed_filter on; 
log_request_speed_filter_timeout 1000; 
proxy_pass http://myupstream/$host_loc; 
proxy_set_header Host $http_host; 

/etc/nginx/vhost.d/somehost.conf

location /one { 
    set $host_loc "one"; 
    include host.impl; 
} 

请注意,Nginx不支持位置URI中的变量。

我建议你基准不同的配置,以选择最有效的。

编辑

如果你想传递/FOUR请求http://myupstream/four以及 /FoUr请求http://myupstream/four等等,那么你应该使用一个 模块,如Perl module,因为目前Nginx的未建成用于URI的小写版本的变量,或用于将位置URI转换为小写的内置函数。

/etc/nginx/nginx.conf

http { 
    perl_set $uri_lc 'sub { return lc shift->uri; }'; 
} 

在子程序中,我们:

结果被分配给$uri_lc Nginx的变量。

/etc/nginx/vhost.d/somehost.conf

location ~* ^/(one|two|three)$ { 
    log_request_speed_filter on; 
    log_request_speed_filter_timeout 1000; 
    proxy_pass http://myupstream$uri_lc; 
    proxy_set_header Host $http_host; 
} 

的标记^(开始)和$(完)是很重要的。

+0

在上面的例子中,如果有人调用http://example.com/FOUR,传递给上游的值是“四”还是“四”?我需要它是“四”。 –

+0

@ R.Smith,我已经更新了答案 –

+0

谢谢!这正是我所需要的。 –