我正在尝试使用 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
and XSendFilePath
到当前版本应用程序的真实位置,路径上没有符号链接。但直到下一次部署之前都可以,这需要重新配置 apache。不太有用。
我应该如何配置 Capistrano 部署和 XSendFile 参数以使其协同工作?
我尝试了解决方案ln -nFs
描述于Capistrano 和 X-Sendfile https://stackoverflow.com/questions/22115011/capistrano-x-sendfile and in 带有符号链接的 mod_xsendfile https://stackoverflow.com/questions/5573853/mod-xsendfile-with-symbolic-links但没有一个有效。
我终于成功了。给那些在使用 XSendFile 时遇到问题的人的一些提示
- I set
XSendFilePath
到用户的$HOME
,路径上没有符号链接$HOME
,所以它有效。从功能和安全的角度来看,我可以接受这一点,但这显然是一种解决方法。
- 意识到
XSendFilePath
对包含多个斜杠的路径敏感/like//this
。我正在使用 apache 宏,同时连接XSendFilePath
参数中的几个宏参数我放了一些过时的斜杠。这导致 XSendFile 拒绝发送文件。
祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)