如何限制对文件夹的访问但允许对特定文件的访问(允许绝对路径)

时间:2019-01-22 08:16:50

标签: nginx ubuntu-18.04 nginx-reverse-proxy nginx-config

我正在尝试配置nginx反向代理以通过REST API提供图像。

但是我仍然坚持配置对这些图像的访问。我需要在以下位置禁用访问权限和列表功能:

domaine.name/images/

domaine.name/images/t/

domaine.name/images/t/p/

但是要允许访问:

domaine.name/images/profile.png

domaine.name/images/t/zgdizgugiuzgdiu.gif

domaine.name/images/t/p/878675465.png

您知道如何在nginx配置文件上执行此操作吗?这是正则表达式还是其他?

我已经尝试过这种正则表达式,但是没有用。

    location ~* ^.+.(jpeg|gif|png|jpg)
    {
            allow all;
    }

谢谢!

编辑

这是我完整的nginx配置:

server {
    server_name www.domain.com domain.com;

    location /images/ {
        deny all;
        return 403;
    }

    location /images/^.+.(jpeg|gif|png|jpg) {
        allow all;
    }

    location / {
        proxy_pass  http://127.0.0.1:8080/;
    }

    location /dbadmin {
        deny all;
            proxy_pass http://127.0.0.1:4321/dbadmin;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    error_page 400 /ErrorPages/HTTP400.html;
        error_page 401 /ErrorPages/HTTP401.html;
        error_page 402 /ErrorPages/HTTP402.html;
        error_page 403 /ErrorPages/HTTP403.html;
        error_page 404 /ErrorPages/HTTP404.html;
        error_page 500 /ErrorPages/HTTP500.html;
        error_page 501 /ErrorPages/HTTP501.html;
        error_page 502 /ErrorPages/HTTP502.html;
        error_page 503 /ErrorPages/HTTP503.html;


    location /ErrorPages/ {
            alias /home/webservices/errorPages/;
            internal;
        }
}

server {
    server_name api.domain.com;

    location / {
        deny all;
    }

    location /v1/ {
        proxy_pass  http://127.0.0.1:8888/;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    error_page 400 /ErrorPages/HTTP400.html;
        error_page 401 /ErrorPages/HTTP401.html;
        error_page 402 /ErrorPages/HTTP402.html;
        error_page 403 /ErrorPages/HTTP403.html;
        error_page 404 /ErrorPages/HTTP404.html;
        error_page 500 /ErrorPages/HTTP500.html;
        error_page 501 /ErrorPages/HTTP501.html;
        error_page 502 /ErrorPages/HTTP502.html;
        error_page 503 /ErrorPages/HTTP503.html;

    location /ErrorPages/ {
            alias /home/webservices/errorPages/;
            internal;
        }
}
server {
    if ($host = www.domain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = domain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name www.domain.com domain.com;
    return 404; # managed by Certbot
}

server {
    if ($host = api.domain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name api.domain.com;
    return 404; # managed by Certbot
}

编辑2:

我解决了问题! 我把它放在配置中的位置块上并工作了。在我尝试匹配images / url和/images/something.png之前。我不知道为什么它不起作用。

为解决此问题,我尝试匹配/ images / url,因此domain.com/images/将被阻止。然后,我尝试匹配所有以.png .jpeg等结尾的网址,以允许它们。

location /images/ {
                deny all;
                return 404;
        }

        location ~* .(png|gif|ico|jpg|jpeg|svg)$ {
                proxy_pass      http://127.0.0.1:8080;
        }

0 个答案:

没有答案