我设置了两个apache服务器。一个是面向公众,另一个是防火墙。防火墙后面的那个用于提供内容(视频,图片等)。我已经设置了一个反向代理,以便http://mysite.com/content/的任何请求实际上都会进入防火墙内的服务器。请参阅我的服务器故障question。
我的网站使用PHP和MySQL对用户进行身份验证。身份验证不适用于/ content目录中的任何内容,因为apache会立即将请求发送到内部服务器。理想情况下,我想在面向公众的服务器上对用户进行身份验证,并从防火墙内的内容服务器中提供内容。
是否有办法只允许经过身份验证的用户访问/ content目录?
答案 0 :(得分:2)
虽然这个答案可能并不代表“最佳实践”,但它确实很有效
我们使用带有apache的后端服务器作为各种“文件服务器” - 提供用户上传到其帐户的私人文件和图像。以下是它的工作原理:
设置mod_rewrite以处理您想要的URL。例如:
RewriteRule /content/(.*) /ServeContent.php?FileName=$1
脚本ServeContent.php将执行以下操作:
1. Validate input
2. Authenticate user based on cookie or session data
3. Make a URL with $_GET['FileName'] and the IP of the backend server
http://192.168.1.30/content/somefile.jpg
4. Set appropriate headers for the file type
header('Content-type: image/jpeg')
5. readfile($URL)
这种方法要求在PHP中启用fopen-wrappers。 readfile
不会将内容存储在内存中,因此这实际上并没有使用太多内存。其中一个主要缺点是你会在请求期间(可能需要很长时间)保持一个apache / php进程。但实际上,除非您运行的是高流量网站,否则您可能不会遇到任何问题。
如果你是,那么最有可能找到更好的解决方案。但是对于我们来说,这对于各种应用程序中的大型文件非常有效。