nginx访问静态文件的方式

在最近的项目中,需要nginx来访问具体静态资源。针对这种情况,除了常规使用nginx的反向代理,还有那些方式可以访问具体静态资源。本文列举一些针对静态资源的访问方式。

新建 D:\nginx\json\config.json

json 复制代码
{
    "title":"config.json"
}   

新建 D:\nginx\json\games.json

css 复制代码
[    {        "title":"games.json"    }       ]

新建 D:\nginx\json\localhost\games.json

css 复制代码
[    {        "title":"localhost/games.json"    }        ]

1、方式:

a、proxy_pass

bash 复制代码
server {
        listen       80;
        server_name  localhost;

        location ~ ^/api/(?<param>[^/]+)$ {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept';             
            default_type application/json;
            set $target_url "http://127.0.0.1:5500/json/$param";
            proxy_pass $target_url;
        }  

    }

b、try_files

  • try_files 是 Nginx 中的一个指令,它的作用是按顺序尝试在本地文件系统中查找指定的文件,并返回第一个找到的文件,若所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。
bash 复制代码
server {
        listen       80;
        server_name  localhost;

        location ~ ^/api/(?<param>[^/]+)$ {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept';             
            default_type application/json;
            root json;
            try_files /$host/$param /$param @notfound;
        }  
        location @notfound {
            return 404;
        }

    }

运行指令

javascript 复制代码
docker run --name some-nginx -p 8801:80 -v D:/nginx/json:/etc/nginx/json:ro -v D:/nginx/config/nginx.conf:/etc/nginx/nginx.conf -d nginx

结果:

bash 复制代码
访问http://localhost:8801/api/games.json,结果显示:localhost/games.json
访问http://localhost:8801/api/config.json,结果显示:config.json

c、alias

alias 是 Nginx 中的一个指令,它的作用是为指定的路径设置一个别名(即替换路径)。当客户端请求匹配到指定的路径时,Nginx 会将路径替换为指定的别名,并将请求转发到替换后的路径上。

bash 复制代码
server {
        listen       80;
        server_name  localhost;

        location ~ ^/api/(?<param>[^/]+)$ {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept';             
            default_type application/json;
            alias json/$param;
        }  
        location @notfound {
            return 404;
        }

    }

重新运行指令后,结果:

bash 复制代码
访问http://localhost:8801/api/games.json,结果显示:games.json
访问http://localhost:8801/api/config.json,结果显示:config.json

d、proxy_pass+minio+路径优先级访问验证

需要proxy_pass+error_page+minio来实现类似try_files功能。当访问http://localhost:8801/api/games.json 优先读取minio上:/域名/games.json数据。如果找不到文件,默认读取minio上:/games.json数据。其中https://play.min.io:9000是官方测试地址。

ini 复制代码
server {
        listen       80;
        server_name  localhost;
        resolver 8.8.8.8;
        fastcgi_intercept_errors on;
        proxy_intercept_errors on; 

        location ~ ^/api/(?<param>[^/]+)$ {
            proxy_pass https://play.min.io:9000/mini-wzx/localhost/$param;
            error_page 404 =200 @fallback;
        }

        location @fallback {
            proxy_pass https://play.min.io:9000/mini-wzx/$param;
            error_page 404 =404 @notfound;
        }

        error_page 404 = @notfound;
        location @notfound {
            return 404 "Page not found";
        }


    }

经过测试,这样是可以实现这个文件读取优先级功能,但是存在一些小问题:

1、就是接口在nginx这边产生访问两次,默认访问时间会变长点

2、以及第二次访问子路径数据,如果数据不存在,404变成默认的404处理。

2、参考

相关推荐
行思理11 小时前
Nginx 跨站请求(CORS)配置完全指南:从原理到生产实践
java·前端·nginx
李迟17 小时前
Nginx容器绑定81端口报拒绝访问错误的解决
运维·nginx
杨云龙UP17 小时前
生产实战:Keepalived + Nginx + MySQL 双向复制高可用架构部署与原理详解
运维·数据库·mysql·nginx·架构·keepalived·高可用架构
国际云,接待1 天前
云服务器 WebSocket 空闲后频繁断开:查 Nginx 超时、心跳与负载均衡,再评估扩容
服务器·websocket·nginx
庵中十三居士2 天前
用nginx代理DeepSeekHarness挂在域名下特定路径提供访问
运维·nginx·deepseek·harness
fb_123452 天前
K8s 网络通关手册:Ingress-Nginx 生产级路由 + Calico 三种隧道模式 + NetworkPolicy 白名单实战
网络·nginx·kubernetes
承渊政道2 天前
新增一台服务器时还要重新装Nginx?Ansible只改hosts目标列表,同一份Playbook继续执行
运维·nginx·ansible·内网穿透·cpolar
KIDULT°2 天前
K8s 网络进阶实战:Ingress-Nginx、Calico 与 NetworkPolicy 实验 + 排坑记录
网络·nginx·云原生·kubernetes
姜鱼问生3 天前
网页一片白?Docker 跑 Nginx 读不到文件,403 Forbidden 排查实录
nginx·docker·容器
我不会起名字3225 天前
网关超时比服务短:一次 499 的完整归因
网关·nginx·排查·499