nginx重写安全链接

时间:2013-07-16 15:17:26

标签: nginx rewrite

我正在尝试重写一个安全链接,这是我的nginx conf:

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

    # MEMBERS ONLY #####
    location /auth/ {
        secure_link $arg_h,$arg_e;
        secure_link_md5 authkey$uri$arg_e;
        if ($secure_link = "") {
            return 403;
        }
        if ($secure_link = "0") {
            return 403;
        }
        rewrite  ^/auth/(.*)$  /files/$1  break;
        add_header Content-Disposition "attachment; filename=$arg_f";
    }

如果我放下这样的下载链接,它的工作是:

http://13.37.13.37/auth/path/to/dir/file.zip?h=sdiouqosid&e=1337&f=the_file.zip

但是如果我打印这样的链接就不行了:

http://subdir.mysite.org/auth/path/to/dir/file.zip?h=sdiouqosid&e=1337&f=the_file.zip

请注意:

  • subdir.mysite.org在DNS记录中有“A”redir到13.37.13.37
  • 13.37.13.37是与mysite.org不同的服务器

此外:
- http://subdir.mysite.org/path/to/something/somefile.zip效果很好,只有当我使用secure_link时才会失败(返回403或者加载ressource失败)。我想这与我的url_rewrite有关。对于这种奇怪的行为,我尝试了很多事情而没有任何成功。

谢谢你的帮助

编辑:
完整nginx如下:

user www-data;
worker_processes  2;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    #server_tokens off;

    keepalive_timeout  65;

    gzip on;
    gzip_disable "msie6";

    limit_conn_zone $binary_remote_addr zone=freeuser:10m;

    map $request_uri $request_qs {
        default '';
        ~.*\?(?P<key>.+)$ $key;
    }

    server {

        listen          80;
        server_name     localhost;
        root            /var/www;


        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            access_log off;
            add_header Cache-Control public;
        }


        location ~* \.(jpg|jpeg|gif|css|png|js|ico|swf|mp3)$ {
            expires        365d;
            access_log     off;
        }


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


        location /auth/ {
            secure_link $arg_h,$arg_e;
            secure_link_md5 authkey$uri$arg_e$remote_addr;
            if ($secure_link = "") {
                return 403;
            }
            if ($secure_link = "0") {
                return 403;
            }
            rewrite  ^/auth/(.*)$  /file/$1  break;
            add_header Content-Disposition "attachment; filename=$arg_f";
        }


    }

}

2 个答案:

答案 0 :(得分:0)

我要说改变/files块,因为现在返回403是合乎逻辑的,因为你只是拒绝所有。

location /files/ {
    internal;
}

对于非授权而不是403,这将返回404,不知道这是否适合您。

答案 1 :(得分:0)

我解决了编辑“反向”(主机名)的问题 的问候,