我目前在 nginx 后面设置了一个 Web 应用程序,需要将其移至 Apache httpd。
我真正想要重新实现的当前缺少的一个功能是基于 X-Accel-Redirect 的功能。
与 不同X-Sendfile
, 的值X-Accel-Redirect
被视为 URL,因此我可以在其上执行与在任何其他位置相同的所有功能。在本例中,我使用它从外部服务器获取实际文件,而不是直接从本地服务器获取。
相关配置如下:
location ~* ^/secure-download(.*) {
internal;
set $file_info 'attachment; filename=${upstream_http_filename}';
add_header Content-Disposition $file_info;
# proxy configuration code here
proxy_cache cachename;
proxy_cache_valid 200 302 60m; # cache successful responses for 60min
proxy_cache_valid 404 1m; # cache missing responses for 1min
resolver 172.31.0.2 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
proxy_pass 'https://proxy-server.example.org/$1';
}
这样做有很多好处:
- 我不需要将内容存储在本地
- 我可以手动设置下载的文件名
- 浏览器不必重定向到其他 URL
- 我不需要让 Web 应用程序下载然后提供内容,因为这样速度会比较慢。
据我所知,问题在于不是apache httpd 中有一个类似的功能 — — 基本上就是说“停止提供我刚刚创建的所有内容,而是提供位于此标头中的 URL”。
如果这不可能的话,我可能会重写 Web 应用程序,以便它从外部 URL 下载文件内容然后提供服务,即使这确实是一种非理想的情况。
答案1
提交评论作为答案以供将来参考。
apache 没有直接可比的功能。
apache 有一个 x-sendfile 模块,但它不支持非文件系统 URL。
我们可以做的是使用 httpfs(一个保险丝文件系统模块)将远程 http 服务器“挂载”到本地文件系统,然后从这些挂载点执行 x-sendfile。
这是一个“自行承担风险”的解决方案。
如上所述,一种替代方法是将应用程序更改为重定向到外部 URL。
另一个未讨论的方法是使用一些 Web 服务器支持的授权(检查是否存在 cookie 或类似内容),然后使用普通的远程代理配置。这更符合 Web 服务器的使用,尽管由于尚未讨论的原因可能不起作用。
答案2
我最终在应用程序端添加了代码,从代理下载所需的文件并提供该文件。
尽管与直接提供服务的 Web 服务器相比,开销更大,但响应时间仍然相当不错 — 我没有注意到任何减速或任何明显的额外负载。对于非常大的文件,可能会发生这种情况,在这种情况下,我可能会为这些情况想出一个替代解决方案。