我目前在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'; }
这有很多好处:
就我所知,这个问题在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。