在 apache httpd 上重新创建 nginx 的 X-Accel-Redirect 功能(能够使用 URL 而不是绝对路径)

在 apache httpd 上重新创建 nginx 的 X-Accel-Redirect 功能(能够使用 URL 而不是绝对路径)

我目前在 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 服务器相比,开销更大,但响应时间仍然相当不错 — 我没有注意到任何减速或任何明显的额外负载。对于非常大的文件,可能会发生这种情况,在这种情况下,我可能会为这些情况想出一个替代解决方案。

相关内容