NGINX和LUA强制小写URI,同时保持查询字符串

注意:Lua小白

尝试在保持查询字符串参数不变且附加的情况下强制小写URI。

我能够使用lua string.lower(ngx.var.uri)处理URI,但是它会删除查询字符串。

我尝试在尝试文件中添加$is_args$args,但相信这是在那之前被删除的。

我认为我必须在lua中创建一个带有ngx.req.get_uri_args的表,并创建另一个块以在将URI转换为小写后将其附加回来..只是不确定这是否是正确的方法。

我没有看到如何在set_by_lua_block结果上使用ngx.req.set_uri_args来设置args的文档,而不是初始请求..

这是我尝试过的两个代码块。

#仅适用于URI,但删除了查询字符串参数

set_by_lua_block $uri_lowercase { return string.lower(ngx.var.uri) }

location ~ [A-Z] {
        try_files $uri $uri/ $uri_lowercase $uri_lowercase/ =404;
 }

还尝试了这个,但不起作用:

       location ~ [A-Z] {
                try_files $uri $uri/ $uri_lowercase$is_args$args $uri_lowercase/$is_args$args  =404;
        }

在这里,任何想法都受到赞赏--谢谢大家

点赞
用户3641164
用户3641164

这样做是有效的,但它会进行内部重写,这会使浏览器中的 URL 变成大写。

这个配置会重写所有含有大写字母的链接,且不会影响静态文件。注意:需要在Ubuntu上安装nginx-extras才能使用。

我修改了我的块,如下所示,

set_by_lua $uri_lowercase "return string.lower(ngx.var.uri)";
location ~ (([A-Za-z])\w+(?!(ttf|woff2|otf|eot|svg|png|jpg|jpeg|css|js)$)([^.]+$)) {
rewrite ^(.*)$ $scheme://$host$uri_lowercase;
}

正则表达式说明:

([A-Z])\w+ = 包含大写字母的任何单词

(?!(ttf|woff2|otf|eot|svg|png|jpg|jpeg|css|js)$) = 负向预查,指定一个在主要表达式后不能匹配的组(如果匹配,将丢弃结果)。

([^.]+$) = 否定的集合,不捕获以句点结尾的字符串,例如style.css。

2020-04-30 12:53:51
用户4847057
用户4847057
```lua
set_by_lua $uri_lowercase "return string.lower(ngx.var.uri)";

匹配所有含有大写字母的URI路由,并将其重定向为小写路由:

location ~ [A-Z] {
  return 301 $scheme://$http_host$uri_lowercase$is_args$args;
}
2022-03-22 16:11:44