有时候我们有对请求拦截的需求,比如做log、做权限校验等等,那X-Accel-Redirect可以让Nginx帮我们做到。
比如我们可以有一个项目专门负责权限处理,请求过来后,只有符合权限的,才会被转发到真实地址。

或者是我们想配置Nginx作为下载服务器,但是真实地址不想被外部知道,也可以使用X-Accel。

示例

下面有两份示例代码

  • 一份是Nginx的配置,来达到内部重定向的效果;
  • 一份是简单的Server代码,接受http请求。

Nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
server_name your.host;

access_log off;

location /api {
proxy_pass http://localhost:3000;
}

location /internal {
internal;
proxy_pass http://localhost:3000;
}
}

Server端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();

const router = new Router();
router.get('/api/', ctx => {
ctx.body = { 'hello': 'world' };
});

// api接口
router.get('/api/request', ctx => {
// 这里告诉Nginx需要做内部重定向
ctx.set({'X-Accel-Redirect': '/internal/request'});
ctx.status = 200;
});

// 经过Nginx转发的内部请求
router.get('/internal/request', ctx => {
ctx.body = { 'hello': 'im here' };
ctx.status = 200;
});

app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

console.log('server listen at 3000');

效果

在Nginx的配置中,我们对/internal开头的请求,做了internal标识,外部是没办法直接访问到的。
对于GET /internal/request的这个请求,只能通过/api/request请求到达后,Nginx做内部重定向。
直接访问/internal/request,会得到Nginx的404结果。

相关代码与配置放在github上here

其他相关头部

上面我们是用了X-Accel-Redirect,关于X-Accel还有几个其他头部参数可以设置,比如编码类型charset,过期时间等,具体可以参考X-Accel