处理通过Nginx代理Minio或其他服务无法正常加载附件、出现报错情况、通过nginx配置重写路径规则解决【测试成功】

艺帆风顺 发布于 2025-04-03 19 次阅读


一、问题背景

    存在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,即可看到附件加载正常: