通过PHP进行Apache反向代理验证

时间:2009-10-29 20:58:08

标签: php apache authentication reverse-proxy

我设置了两个apache服务器。一个是面向公众,另一个是防火墙。防火墙后面的那个用于提供内容(视频,图片等)。我已经设置了一个反向代理,以便http://mysite.com/content/的任何请求实际上都会进入防火墙内的服务器。请参阅我的服务器故障question

我的网站使用PHP和MySQL对用户进行身份验证。身份验证不适用于/ content目录中的任何内容,因为apache会立即将请求发送到内部服务器。理想情况下,我想在面向公众的服务器上对用户进行身份验证,并从防火墙内的内容服务器中提供内容。

是否有办法只允许经过身份验证的用户访问/ content目录?

1 个答案:

答案 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进程。但实际上,除非您运行的是高流量网站,否则您可能不会遇到任何问题。

如果你是,那么最有可能找到更好的解决方案。但是对于我们来说,这对于各种应用程序中的大型文件非常有效。

相关问题