在Apache httpd上重新创buildnginx的X-Accel-Redirectfunction(能够使用URL而不是绝对path)

我目前在nginx后面build立了一个web应用程序,需要将它移到Apache httpd。

我真正想要重新实现的一个function是基于X-Accel-Redirect的function。

X-Sendfile不同, X-Accel-Redirect值被视为一个URL,所以我可以执行所有相同的function,我可以在任何其他位置。 在这种情况下,我使用它从外部服务器获取实际文件,而不是直接从本地服务器获取文件。

这里是相关的configuration:

 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'; } 

这有很多好处:

  • 我不需要在本地存储内容
  • 我可以手动设置下载的文件名
  • 浏览器不必redirect到不同的URL
  • 我不必使Web应用程序下载,然后提供更慢的内容。

就我所知,这个问题在apache httpd中没有类似的function – 基本上说,“停止提供我刚刚创build的所有内容,而是提供位于此标头中的URL”。

如果这是不可能的,我可能只是重写Web应用程序,以便从外部URL下载文件的内容,然后提供,即使这是一个非常理想的情况。

提交评论作为未来参考的答案。

Apache没有直接比较的function。

Apache有一个x-sendfile模块,但是它不支持非文件系统的URL。

可以做的是使用httpfs,熔丝文件系统模块,将远程http服务器“挂接”到本地文件系统,然后从这些挂载点发送x-sendfile文件。

这是一个“自负风险”的解决scheme。

一种替代方法就是提到的 – 将应用程序更改为redirect到外部URL。

另一个没有讨论的是使用一些networking服务器支持的授权 – 在普通的远程代理configuration之前检查是否存在cookie或类似的。 这是更加同情的networking服务器的使用,虽然可能不起作用的原因尚未讨论。

我刚刚结束了在应用程序端添加代码,从代理下载所需的文件并提供它。

虽然比直接服务的Web服务器有更多的开销,但响应时间仍然相当不错 – 我没有注意到任何放缓或任何明显的额外负载。 这可能会发生在非常大的文件中,在这种情况下,我可能会为这些情况提出一个备用解决scheme。