2

我设置了两个 apache 服务器。一个面向公众,另一个位于防火墙后面。防火墙后面的一个用于提供内容(视频、图片等)。我已经设置了一个反向代理,这样对http://mysite.com/content/的任何请求实际上都会发送到我的防火墙内的服务器。请参阅我的服务器故障问题

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

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

4

1 回答 1

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

如果你是,很可能有更好的解决方案。但这对于我们在各种应用程序上的大文件非常有效。

于 2009-10-29T21:16:29.737 回答