upper/lower 个案例位置的 Nginx 规则
Nginx rules for upper/lower case locations
所以,这是我的情况。我的网站有一些来自单独的上游应用程序的自定义逻辑。我现在可以正常工作,但我直接的解决方案有点冗长。我将很快添加更多这些自定义位置,并添加以大写和小写形式访问这些位置的能力。我的解决方案可行,但位置列表很快就会变得笨拙,我想重新考虑我的解决方案。
因此,假设我的上游名为“myupstream”并且已在文件中定义。我的自定义位置将是一、二、三和四。 (为保护自身利益更改了真实位置名称)。
所以这些网址:
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/;
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:
哪种方式更resource/process效率高?
提前谢谢你..
使用不区分大小写的location匹配:
location ~* /(one|two|three) {
log_request_speed_filter on;
log_request_speed_filter_timeout 1000;
proxy_pass http://myupstream/;
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; }';
}
在子程序中,我们:
- 用
shift
获取request object;
- 从请求对象获取当前 URI:
shift->uri
;
- 将 URI 传递给
lc
function 并 return 结果
结果赋值给$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;
}
标记 ^
(开始)和 $
(结束)很重要。
所以,这是我的情况。我的网站有一些来自单独的上游应用程序的自定义逻辑。我现在可以正常工作,但我直接的解决方案有点冗长。我将很快添加更多这些自定义位置,并添加以大写和小写形式访问这些位置的能力。我的解决方案可行,但位置列表很快就会变得笨拙,我想重新考虑我的解决方案。
因此,假设我的上游名为“myupstream”并且已在文件中定义。我的自定义位置将是一、二、三和四。 (为保护自身利益更改了真实位置名称)。
所以这些网址:
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/;
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:
哪种方式更resource/process效率高?
提前谢谢你..
使用不区分大小写的location匹配:
location ~* /(one|two|three) {
log_request_speed_filter on;
log_request_speed_filter_timeout 1000;
proxy_pass http://myupstream/;
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; }';
}
在子程序中,我们:
- 用
shift
获取request object; - 从请求对象获取当前 URI:
shift->uri
; - 将 URI 传递给
lc
function 并 return 结果
结果赋值给$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;
}
标记 ^
(开始)和 $
(结束)很重要。