Nginx的internal路径和内部重定向(X-Accel-Redirect)
有时候我们需要通过业务逻辑限制用户对某些路径的访问,这件事情通过nginx配置本身是做不了的,例如登录用户校验之类的逻辑。举个栗子:
有一个文件,这个文件位于服务器的
/home/server/private_files/
目录。只有高等级的用户才能获取下载路径,且下载路径有时效,过期则失效。
要实现此功能,我们得把它分为两部分:一部分是下载路径的生成和有效性判断,这部分是业务逻辑代码实现的;另一部分则是对这个文件的保护,只有通过业务逻辑校验的请求才有权拿到此文件。
此时我们就需要用到Nginx的内部重定向功能了。
我们需要知道的两个知识点:
- Nginx在做反向代理拿到服务端生成的结果时,会检查服务端返回的响应头(Response Header),检查此字段:X-Accel-Redirect。如果此字段设置了内容,Nginx则会根据其设置的重定向地址,直接请求此地址的数据,并将数据输出。
- Nginx的location配置可以使用internal标记,将此路径标记为只允许内部访问。内部访问的意思并不是说localhost就可以访问,而是说「一次请求的」内部。
那么如何配置呢?
首先,nginx需要加上如下配置:
location /get_file/ {
fastcgi_pass xxxxx # 或 proxy_pass,用于将请求转发到服务端
}
location /private_files/ {
# 内部路径,禁止直接请求
internal;
alias /home/server/private_files/
}
然后,在服务端实现对 /get_file/xxx
的处理逻辑,如果允许访问,则返回的响应头中,写入如下信息:(以php为例)
// And redirect user to internal location
header("X-Accel-Redirect: /private_files/a.txt");
用图来表示一下:
在用户直接请求 /private_files/a.txt
时
在用户请求 /get_files/xxxx
时