首页 新闻 会员 周边

nginx如何用一个路径代理多个目录?

0
悬赏园豆:10 [已解决问题] 解决于 2023-03-10 09:55

我需要通过nginx代理静态资源目录。用户访问同一个路径:upload/*/1.txt,然后通过nginx,先去文件夹test1下找1.txt,没找到时通过error_page跳转到test2下,如果test2下没有跳转到test3下 .
就是遍历test1、test2、test3文件夹,找一个文件。找到直接返回,没找到跳转下一个。

目前两个文件夹是可行的,第三个怎么都触发不了

玩屎的猪的主页 玩屎的猪 | 初学一级 | 园豆:59
提问于:2023-02-27 18:41
< >
分享
最佳答案
0

user nobody;

worker_processes 1;

events {
worker_connections 1024;
}

http {

proxy_intercept_errors on;   
server {
    listen  8084;
    location /upload1/test{
		proxy_pass http://192.168.0.188:8082/upload/test1; 
		if ( $request_uri ~ (?<=/upload1/test)(.*)){
				set $url $1;
    		}
		error_page 404 http://192.168.0.188:8084/upload2/test$url;
    }
    location /upload2/test{
		proxy_pass http://192.168.0.188:8082/upload/test2;
		if ( $request_uri ~ (?<=/upload2/test)(.*)){
				set $url $1;
    		}
		error_page 404 http://192.168.0.188:8084/upload3/test$url;
    }
    location /upload3/test{
		proxy_pass http://192.168.0.188:8082/upload/test3;
		error_page 404 /404.html;
    }
    
	location / {
	#允许跨域请求
	add_header 'Access-Control-Allow-0rigin' *;
	#允许带上cookie请求
	add_header 'Access-Control-Allow-Credentials' 'true';
	#允许请求的方法,比如GET/POST/PUT/DELETE
	add_header 'Access-Control-Allow-Methods'  GET,POST,PUT,DELETE,PATCH,OPTIONS;
	#允许请求的header
	add_header 'Access-Control-Allow-Headers' *;			
            root   html;
            proxy_pass http://192.168.0.188:8082;
            proxy_connect_timeout 10s;
            #报表过大需要注意
            proxy_read_timeout 600s;
            proxy_set_header Host $host:8082;
            proxy_send_timeout 30s; 
            index  index.html index.htm;
   	 }
}

}

玩屎的猪 | 初学一级 |园豆:59 | 2023-03-10 09:44
其他回答(1)
0

Nginx可以使用location块来实现一个路径代理多个目录的功能。可以按照以下方式进行配置:

location /proxy/ {
    proxy_pass http://backend/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

上述配置中,/proxy/是需要代理的路径,代理的请求将被转发到http://backend/,并在代理请求中设置了Host和X-Real-IP请求头。

假设有如下请求需要被代理:http://example.com/proxy/dir1和http://example.com/proxy/dir2,Nginx会将这些请求转发到http://backend/dir1和http://backend/dir2,并在转发请求时保留了原始请求中的路径。

注意,在以上示例中,http://backend/后面没有斜杠,这是因为在代理请求时,Nginx会将原始请求中的路径拼接到代理地址后面。如果在http://backend/后面添加斜杠,则请求会被转发到http://backend//dir1和http://backend//dir2,这可能导致请求无法正常处理。

收获园豆:10
心若向阳花自开 | 园豆:290 (菜鸟二级) | 2023-03-08 14:36

谢谢,我的问题是有一个文件,存在于3台服务器中的其中一台,且每台服务器上的文件访问其IP:PORT/upload/***.txt能访问到。我再使用nginx来代理三台的/upload地址,以达到某文件无论在三台哪一台上,我可以访问到的目的。目前采用的方法是利用error_page 404做转发。

支持(0) 反对(0) 玩屎的猪 | 园豆:59 (初学一级) | 2023-03-10 09:52

此问题我已经解决了,详细配置在下方评论,我不知跟您所描述的答案是否有区别

支持(0) 反对(0) 玩屎的猪 | 园豆:59 (初学一级) | 2023-03-10 09:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册