我正在尝试使用Apache 2.2,Passenger 4.0.59和XSendFile 0.12配置Rails生产服务器。应用程序通过Capistrano部署。
已部署的应用程序生成(可能很大)PDF到#{Rails.root}/tmp
并使用send_file
提供此文件。
问题是Capistrano使用符号链接指向当前部署的应用程序版本。另一方面,XSendFile取消引用符号链接,如果文件的真实位置在文档根目录之外,即使XSendFilePath
允许,也拒绝提供文件。 Apache的error.log状态:
(20023)The given path was above the root path: xsendfile: unable to find file: /resolved/path/to/file.pdf
当我将PassengerAppRoot
和XSendFilePath
设置为当前应用程序版本的实际位置时,一切都运行良好,路径上没有符号链接。但是直到下次部署才行,这需要重新配置apache。不太有用。
我应该如何配置Capistrano deploy和XSendFile参数以使其协同工作?
我尝试使用Capistrano & X-Sendfile和mod_xsendfile with symbolic links中描述的ln -nFs
解决方案,但都没有效果。
答案 0 :(得分:0)
我终于成功了。有关XSendFile存在问题的人的一些提示
XSendFilePath
设置为用户的$HOME
,$HOME
路径上没有符号链接,因此可以正常工作。我可以从功能和安全的角度来接受这一点,但这显然是一种解决方法。XSendFilePath
对包含多个斜杠/like//this
的路径很敏感。我正在使用apache宏,并在从几个宏参数连接XSendFilePath
参数时,我放了一些过时的斜杠。这导致XSendFile拒绝发送文件。