V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daimaosix
V2EX  ›  程序员

Nginx 反向代理配置只允许访问某路径或后缀文件

  •  
  •   daimaosix · 2019-11-28 22:39:11 +08:00 · 4558 次点击
    这是一个创建于 1820 天前的主题,其中的信息可能已经有所发展或是发生改变。
        location / {
            proxy_pass https://1.123.com;
    
            proxy_http_version	1.1;
            proxy_cache_bypass	$http_upgrade;
    
            proxy_set_header Upgrade			$http_upgrade;
            proxy_set_header Connection 		"upgrade";
            proxy_set_header Host				"1.123.com";
            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;
            proxy_set_header X-Forwarded-Host	"1.123.com";
            proxy_set_header X-Forwarded-Port	$server_port;
        }
    
        #set $limit 1;
        req_status server;
    
    	location ~.*\.(png|jpg) {
        	allow all;
    	}
    	location ~ {
        	deny all;
        	return 403;
    	}
    

    软件

    Tengine-2.3.2

    需求

    配置反向代理之后,只允许访问特定某路径或特定文件后缀。某特定路径不是固定的 URL,其中 1-2 个目录是固定的。

    问题

    目前想到的是只允许访问某后缀。上方最后两个 location 是修改之后的,除了访问.png 和.jpg 的文件路径是 404 以外(不能访问源文件,配置应该是生效了,如果可以访问指定的后缀,这个问题应该就可以解决了),访问其他路径都是 403。

    谢谢各位 V 友可以查看此贴。

    8 条回复    2019-11-29 12:46:16 +08:00
    ibirdyuan
        1
    ibirdyuan  
       2019-11-28 23:00:54 +08:00
    没设置好 root 吧,看下 nginx 的 root 关键字?
    daimaosix
        2
    daimaosix  
    OP
       2019-11-28 23:25:14 +08:00
    @ibirdyuan
    root /etc/nginx/html;
    指向了一个不存在的目录,如果是反向代理的话这个 root 没用吧
    ibirdyuan
        3
    ibirdyuan  
       2019-11-28 23:42:30 +08:00
    @daimaosix 额,我才理解你的问题。。。
    1. location 是有优先级的,根据你的 url 只会走到一个 location 块里面
    2. 因为你配置了.png 和.jpg 所以找了本地目录,就 404 了,~ 的优先级高于 /, 所以就 403 了
    eason1874
        4
    eason1874  
       2019-11-29 00:00:47 +08:00   ❤️ 1
    是不是这个意思啊?

    ```
    set $proxyurl "https://1.123.com$uri";

    proxy_http_version 1.1;
    proxy_cache_bypass $http_upgrade;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host "1.123.com";
    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;
    proxy_set_header X-Forwarded-Host "1.123.com";
    proxy_set_header X-Forwarded-Port $server_port;

    location / {
    # 默认屏蔽
    deny all;
    }

    location ~* \.(png|jpg)$ {
    # .png .jpg 请求转发到后端
    proxy_pass $proxyurl;
    }

    location /images/ {
    # /images/ 目录路径请求也转发到后端
    proxy_pass $proxyurl;
    }
    ```
    daimaosix
        5
    daimaosix  
    OP
       2019-11-29 01:05:20 +08:00
    @eason1874 是这个效果老哥,测试了一下没问题,但是我不能写 set $proxyurl "https://1.123.com$uri";
    因为第一个 location 的配置不能自定义,所以我直接写了:
    location ~* \.(png|jpg)$ {
    proxy_pass https://1.123.com;
    }
    如果是这样的话,第一个 location 的配置是不是就没用了呢?
    daimaosix
        6
    daimaosix  
    OP
       2019-11-29 01:29:19 +08:00
    @ibirdyuan 老哥看下 4 楼那位老哥的方子可行
    eason1874
        7
    eason1874  
       2019-11-29 09:22:58 +08:00   ❤️ 1
    @daimaosix #5 我不知道你说的第一个 location 是指哪个。每个 location 段的 proxy_pass 都可以自定义,我设置个变量只是为了方便统一使用一个。

    但是需要注意,如果在一个目录 location 里 proxy_pass 到一个网站根目录的话,访问路径和转发路径是不一样的,这个你自己试下就知道了。
    wangyzj
        8
    wangyzj  
       2019-11-29 12:46:16 +08:00
    location 用正则控制,那么除了满足条件的都会到 root
    然后 nginx 启动用户假设 www
    把 root 指向一个目录,权限改成 700,用户为 root
    那么其他不满足条件的都 403 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3465 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:48 · PVG 08:48 · LAX 16:48 · JFK 19:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.