今天有幸学习了文件转发这一块了

好久以前, 刚毕业的时候, 我就有想过这个问题, 最后还是不了了之

也确实如此, 文本, 数据传输这块在Web服务器是强项

由应用程序来实现对资源的控制 (权限, 积分规则等等)

应用程序内部对Web服务器通信 (发送特殊Header头)

Web服务器接收后进行特殊处理

然而ApacheNginx的请求头是不相同的, 如下有一张关于sendfile的表:

SENDFILE 头 Web服务器
X-Sendfile Apache, Lighttpd v1.5, Cherokee
X-LIGHTTPD-send-file Lighttpd v1.4
X-Accel-Redirect Nginx, Cherokee

话不多说, 看看在ApacheNginx下, 各自是如何配置的吧

Apache

Apache 需要 mod_xsendfile 的支持.

打开模块后, 发送header头时, 以文件真实路径发送过去即可

应用程序(PHP)则是发送Header头如下:

1
2
$filePath = '/mnt/d/somewhere/004.png';
header("X-Sendfile: $filePath");

Nginx

Nginx下多加了一步映射, 首先PHP代码如下:

1
header("X-Accel-Redirect: /customPath/$filePath");

Nginx里默认是支持 sendfile 的

配置如下:

1
2
3
4
location /customPath/ {
internal;
alias /wwwroot/path/path/; # 注意最後的斜杠
}