nginx 配置location 最好使用最小范围匹配

一个实际的案例,系统使用了nginx 进行minio 静态资源的proxy,同时基于nginx 的rewrite
比如http://<domain>/apps/<s3_bucket> ,实际代理的是minio 的http://minioip:port/s3_bucket
但是因为nginx 同时也配置了一个规则(正则的),同时正则的配置有点范围过大,所以造成请求
资源访问不正确

参考nginx 配置

  • nginx proxy minio
 
location /apps/ {
           if_modified_since off;
           etag off;
           add_header Cache-Control no-store;
           add_header Cache-Control must-revalidate;
           default_type text/html;
           index index.html index.htm;
           rewrite ^/apps/([a-z-A-Z0-9]+)$ /apps/$1/ permanent;
           rewrite ^/apps/([a-z-A-Z0-9]+)/$ /$1/index.html break;
           rewrite ^/apps/(.*) /$1 break;
           proxy_set_header Host $http_host;
           proxy_set_header X-Forwarded-For $remote_addr;
           client_body_buffer_size 10M;
           client_max_body_size 10G;
           proxy_buffers 1024 4k;
           proxy_read_timeout 300;
           proxy_next_upstream error timeout http_404;
           proxy_pass http://minio_prod;
}
  • 系统原有包含的一个nginx location 配置
    因为有一个系统需要配置匹配规则,同时就写了一个正则
 
location ~* /static/ {
            proxy_pass http://127.0.0.1:8082;
            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-Host $server_name;
}
  • minio 数据桶的一个目录

问题说明

因为正则匹配优先比不带修饰符的高,所以资源就走偏了,造成本该请求s3 桶数据的到了以前配置的地方了,页面显示就出现
问题了

解决方法

解决方法很多,对于正则匹配添加前缀开头匹配,参考配置

 
location ~* ^/static/ {
            proxy_pass http://127.0.0.1:8082;
            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-Host $server_name;
}

说明

对于nginx 的配置还是应该仔细思考使用那种配置模式,同时使用使用最小原则,好处很明显
解决问题的同时,不会造成复杂的匹配扩大,造成业务问题,而且还有可能会造成安全问题(比如静态的root
不小心暴露了tls 证书,暴露的源码)

原文地址:https://www.cnblogs.com/rongfengliang/p/14189063.html