如何从浏览器隐藏文件,但仍然在使用NGINX的网络服务器上使用它?

时间:2017-08-19 22:39:31

标签: nginx vagrant

这是我的情景:

我在IAAS提供商处设置了一个流浪云。它使用.json文件作为其目录,将来自vagrant的下载请求定向到服务器上相应的.box文件。

我的目标是从浏览器中隐藏.json文件,以便冲浪者无法直接点击它,例如:http://example.com/catalog.json并看到json输出,因为该输出列出了box文件本身的url。但是,我仍然需要vagrant能够下载并使用该文件,因此它可以抓住这个盒子。

在NGINX文档中,它提到了“内部”指令,它似乎通过try_files提供了我想做的事情,但我认为我要么误解它所做的事情,要么只是做错了。以下是我正在使用的例子:

首先,我有两个子域名。

一个用于.json目录:catalog.example.com 盒子文件的第二个:boxes.example.com

当然,这些映射到服务器上的各个文件夹等。

考虑到这一点,在sites-available / site.conf中,我有以下服务器块:

server {
    listen      80;
    listen [::]:80;
    server_name catalog.example.com;
    server_name www.catalog.example.com;
    root /var/www/catalog;

    # Use try_files to trigger internal directive to serve json files
    location / {
        try_files $uri =404;
    }

    # Serve json files to scripts only with content type header application/json
    location ~ \.json$ {
        internal;
        add_header Content-Type application/json;
    }
}

server {
    listen      80;
    listen [::]:80;
    server_name boxes.example.com;
    server_name  www.boxes.example.com;
    root /var/www/boxes;

    # Use try_files to trigger internal directive to serve json files
    location / {
        try_files $uri =404;
    }

    # Serve box files to scripts only with content type application/octet-stream
    location ~ \.box$ {
        internal;
        add_header Content-Type application/octet-stream;
    }
}

内部指令的NGINX文档说明:

  

指定给定位置只能用于内部请求。对于外部请求,返回客户端错误404(未找到)。内部请求如下:

     

由error_page,index,random_index和try_files指令重定向的请求;

基于此,我的理解是我的服务器块抓住这些子域的任何路径,然后通过try_files传递,应该在通过vagrant调用时使其可用,但如果我点击目录,则将其隐藏在浏览器中或者直接打开一个盒子。

我可以确认无法从浏览器访问这些文件;然而,它们也是流浪者无法接受的。

我在这里误解内部吗?有没有办法实现我的目标?

2 个答案:

答案 0 :(得分:0)

我认为您需要的是将访问级别更改为文件。有3个访问级别(执行,读取和写入),您可以从文件中删除执行访问级别。在服务器上,运行命令:

chmod 766 your_file_name
你可以看到: here and here 了解更多信息。

答案 1 :(得分:0)

  • 确保服务器仅在localhost上侦听敏感呼叫

  • 在运行流浪者的机器(使用任意端口)和IAAS提供程序机器(例如,在Web服务器端口上)之间创建隧道。

  • 在您的IAAS计算机上创建一个只允许与转发的Web服务器端口交互的用户(通过sshd_config)

使用下面的详细信息

https://askubuntu.com/questions/48129/how-to-create-a-restricted-ssh-user-for-port-forwarding

  • 在您的catalog.json网址和您的包装箱文件网址中使用http://:/ path引用隧道服务器

  • 在NGINX配置中使用服务器块,该服务器块仅侦听127.0.0.1:80并且不使用server_name。您甚至可以向此添加default_server,以便任何与其他虚拟主机不匹配的内容都会点击此块

  • 在配置中使用不同根的两个位置分别提供/ var / www / catalog和/ var / www / boxes中的文件。

  • 为.json和.box文件设置正则表达式位置,并使用try_files块接受$ uri或重定向到444(所以你知道它会碰到你的块)

  • 否则拒绝/boxes/catalog

请参阅下面的nginx配置

server {
    listen      80 default_server;
    listen [::]:80 default_server;
    server_name example.com;
    server_name www.example.com;
    root /var/www;

    location ~ /(catalog|boxes) {
        deny all;
        return 403;
    }
}

server {
    listen      80;
    listen [::]:80;
    server_name store.example.com; # I will use an eCommerce platform eventually
    root /var/www/store;
}

server {
    listen      127.0.0.1:80;
    listen [::]:80;
    root /var/www;

    location ~ \.json$ {
        try_files $uri $uri/ =444;i
        add_header Content-Type application/json;
    }

    location ~ \.box$ {
        try_files $uri $uri/ =444;
        add_header Content-Type octet/stream;
    }

    location ~ /(catalog|boxes) {
        deny all;
        return 403;
    }
 }