因为项目中使用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>")
# ';
}
优点:可以快速处理大量路径