nginx路径忽略大小写处理

1,585 阅读1分钟

因为项目中使用nginx和minio来代理静态文件,使用字母大小写不一样的路径,访问同一个页面,返回的页面内容不一致。第一时间想到是nginx对路径的大小写是有区分,针对这种情况使用快速方法(?i)+ rewrite+ $1 来忽略nginx的大小写问题,却发现minio也是区分大小写的,否则获取到的内容也是不对的。因此本文主要针对这种大小写访问同一个路径,解决页面内容不一致的nginx处理方案

1、(?i)+rewrite

rewrite (?i)^/privacy$ /main/privacy.html last;
rewrite (?i)^/(home|privacy|terms|gamebox|today)(/)?$ /main/$1.html last;

优点:

  • 对于少量需要处理大小写的路径可以快速添加处理

缺点:

  • 不适用大规模路径

  • 有跟动态参数挂钩的话$1,虽然nginx忽略大小写,但是重写后的路径会继续存在大小写,而导致内容有问题

2、map 映射处理

可以是用map 的映射关系,通过设置大小写映射,也可以实现路径忽略大小写

//在hhtp下 添加 
    map $request_uri $new_uri {
        #default /terms;
        ~^/Privacy privacy;
        default $request_uri;
    }

//在server 下添加,尝试后,发现只能301重定向才会成功
    if ($request_uri != $new_uri) {
        #return 301 $new_uri;
        rewrite ^ $new_uri permanent;
    }

优点:

  • 实现Nginx stream基于源IP做路由负载
  • 利用Nginx变量($cookie_uin)限制请求数
  • 正向代理动态切换 具体使用可以参考实战经验与实用方法

缺点:

  • 对于大量路径更改起来,要维护一个映射表,
  • 路径出现2次请求,一次301重定向,一次200重定向到小写字母路径上

3、使用lua模块处理

官方文档不建议单独下载nginx后再单独引用lua模块。

为了快速测试,直接使用openresty,内部已经引用lua模块,可以在全局路径中,直接全部转换成小写路径。

测试多种lua的设置路径方式(ngx.redirect,ngx.req.set_uri等),有可能没深入学习lua语法,目前只有重定向的才成功

        location / {
            proxy_pass https://minio.xxx.xxx/xxx.xxx.xxxx/;  

  
            rewrite ^/privacy$ /main/privacy.html last;   
            if ($uri ~ [A-Z]){  
                rewrite_by_lua_block {
                    local uri = string.lower(ngx.var.uri)
                    local args = ngx.var.args
                    ngx.log(ngx.ERR, "uri: ", uri)
                    ngx.log(ngx.ERR, "args: ", args)
                    ngx.redirect(uri)
                }
            }  

            # default_type text/html;
            # content_by_lua '
            #     ngx.say("<p>Hello, World!</p>")
            # ';
        }  

优点:可以快速处理大量路径

参考

nginx map

# Nginx Map:实战经验与实用方法

快速使用openresty去处理nginx和lua

nginx下lua手册