通常可以在以下位置访问文件:
http://example.com/cats/cat1.zip
我想编码/加密路径名(/cats/cat1.zip),以便链接通常不可访问,但在路径名加密/编码后可访问:
http://example.com/Y2F0cy9jYXQxLnppcAo=
我上面使用base64编码是为了简单,但更喜欢加密.我该怎么做呢?我必须编写自定义模块吗?
它提供了相当简单的文件保护方法 – 加密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可访问(正确加密),您正在发送文件以供下载,但如果您需要执行其他操作,则会应用相同的逻辑.