一、问题背景
存在minio文件服务需要通过nginx代理访问,配置向代理如下:
location /test/ {
proxy_pass http://127.0.0.1:9000;
}
配置完毕后访问报错:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
Error>
Code>AccessDeniedCode>
Message>Access Denied.Message>
Key>img/tmp_29b9ec0eac5330878eb86b3f4f3e7ef09ab8ef175e589a4920240409160624.jpgKey>
BucketName>testBucketName>
Resource>/test/img/tmp_29b9ec0eac5330878eb86b3f4f3e7ef09ab8ef175e589a4920240409160624.jpgResource>
RequestId>17C4DA82E3B4B937RequestId>
HostId>dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8HostId>
Error>
二、问题分析
这个错误提示来自Minio服务,通常是因为客户端请求的资源没有权限访问。
具体原因可能是:
- 请求的资源不存在或已被删除。
- 请求的资源已被设置为私有,而客户端没有提供正确的访问凭证。
- 请求的资源被设置了访问权限,但客户端的访问权限不足。
判断可能是代理过程中,文件路径本身出现了问题。
二、问题解决
nginx配置重写规则:
加入配置参数:rewrite "^/test/(.*)$" /$1 break;
location /file {
set $backend_url "http://127.0.0.1:9000";
proxy_pass $backend_url;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
rewrite "^/file/(.*)$" /$1 break;
}
location ^~ /minio/ {
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:9000;
rewrite "^/minio/(.*)$" /$1 break;
}
location /test/ {
proxy_pass http://127.0.0.1:9000;
rewrite "^/test/(.*)$" /$1 break;
}
这是Nginx服务器配置文件中的一条规则,用于重写URL路径。
rewrite "^/test/(.*)$" /$1 break; 的意思是:
rewrite 是Nginx的关键字,用于重写URL路径。
"^/test/(.*)$" 是一个正则表达式,匹配以 "/test/" 开头的URL路径。其中,"^" 表示字符串的开始,"." 表示任意字符,"*" 表示前面的字符可以出现任意次数,"$" 表示字符串的结束。括号 "()" 用于捕获匹配的内容。
/$1 表示将匹配到的内容(即 "/test/" 后面的部分)替换为新的URL路径。"$1" 表示第一个捕获组的内容。
break; 表示停止处理后续的规则,直接使用这个新的URL路径进行后续的处理。
所以,这条规则的作用是将以 "/test/" 开头的URL路径重写为不包含 "/test/" 的新URL路径。例如,如果原始URL是 "/test/example.html",那么重写后的URL就是 "/example.html"。
配置完毕后重载Nginx,即可看到附件加载正常: