在最近的项目中,需要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处理。