在nginx中编码和解码路径名

通常可以在以下位置访问文件:

http://example.com/cats/cat1.zip

我想编码/加密路径名(/cats/cat1.zip),以便链接通常不可访问,但在路径名加密/编码后可访问:

http://example.com/Y2F0cy9jYXQxLnppcAo=

我上面使用base64编码是为了简单,但更喜欢加密.我该怎么做呢?我必须编写自定义模块吗?

如果您唯一关心的是限制访问某些网址,您可以查看 this post on Securing URLsSecure Link Module in Nginx.

它提供了相当简单的文件保护方法 – 加密URL的最基本和最简单的方法是使用secure_link_secret指令:

server {

    listen 80;
    server_name example.com;

    location /cats {
        secure_link_secret yoursecretkey;
        if ($secure_link = "") { return 403; }


        rewrite ^ /secure/$secure_link;
    }


    location /secure {
        internal;
        root /path/to/secret/files;
    }
}

访问cat1.zip文件的URL将是http://example.com/cats/80e2dfecb5f54513ad4e2e6217d36fd4/cat1.zip其中80e2dfecb5f54513ad4e2e6217d36fd4是在连接两个元素的文本字符串上计算的MD5哈希值:

>哈希后面的URL部分,在我们的例子中是cat1.zip
> secure_link_secret指令的参数,在本例中为yoursecretkey

上面的示例还假设通过加密URL可访问的文件存储在/ path / to / secret / files / secure目录中.

此外,还有一种更灵活,但也更复杂的方法,通过使用secure_link和secure_link_md5指令来保护带有ngx_http_secure_link_module模块的URL,通过IP地址限制URL访问,定义URL的过期时间等.

如果您需要完全隐藏您的网址(包括cat1.zip部分),您需要在以下两者之间做出决定:

>在Nginx端处理加密URL的解密 – 编写自己的,或重用其他人编写的模块
>在应用程序的某处处理加密URL的解密 – 基本上使用Nginx将加密的URL代理到您解密它们的应用程序并相应地采取行动,如上面所述.

这两种方法都有利有弊,但IMO后者更简单,更灵活 – 一旦设置了代理,就不需要担心Nginx,也不需要用一些特殊的先决条件来编译它;无需使用您在应用程序中编写的语言编写或编译代码(除非您的应用程序包含C,Lua或Perl中的代码).

这是一个简单的Nginx / Express应用程序示例,您可以在其中处理应用程序中的解密. Nginx配置可能如下所示:

server {

    listen 80;
    server_name example.com;

    location /cats {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://127.0.0.1:8000;
    }

    location /path/to/secured/files {
        internal;
    }
}

在应用程序(Node.js / Express)方面,您可能会遇到以下情况:

const express = require ('express');
const app = express();

app.get('/cats/:encrypted', function(req, res) {
  const encrypted = req.params.encrypted;

  // 
  // Your decryption logic here
  //
  const decryptedFileName = decryptionFunction(encrypted);

  if (decryptedFileName) {
    res.set('X-Accel-Redirect', `/path/to/secured/files/${decryptedFileName}`);
  } else {
    // return error
  }
});


app.listen(8000);

上面的示例假定受保护的文件位于/ path / to / secured / files目录中.此外,它假设如果URL可访问(正确加密),您正在发送文件以供下载,但如果您需要执行其他操作,则会应用相同的逻辑.

相关文章
相关标签/搜索