我有一个现有的网站,需要链接到我们网络服务器上的 pdf 文件。问题是,只有通过登录网站进行身份验证的用户才能查看该文件。我尝试了所有我能想到的方法,但就是搞不清楚如何配置 apache 来做我想要的事情。要么允许所有人访问该文件,要么任何人都无权访问。
我如何设置配置以便只有来自 foo.bar.com 的请求才被授权从 blah.baz.com 获取文件?
更新 在我的网站配置文件中,我目前有
<Directory "/usr/local/web/static/foo">
Order allow,deny
Deny from all
Allow from foo.bar.com
</Directory>
当我在 Chrome 控制台中检查失败的请求时,我可以看到它包含
Host:blah.baz.com
Referer:http://foo.bar.com/
答案1
mod_write
您可以通过以下方式进行操作:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !pippo\.com [NC]
RewriteCond %{REQUEST_URI} ^/foo
RewriteRule .* - [F]
尝试伪造 referer:
curl --referer http://www.pluto.com/bot.html http://localhost/foo
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /
on this server.</p>
</body></html>
答案2
我最终使用“Referer”环境变量来检查请求是否来自正确的站点。因此,对于我上面给出的示例,配置将如下所示:
ServerName blah.baz.com
DocumentRoot /usr/local/web/static
SetEnvIf Referer foo.bar.com localreferer
<Directory "/usr/local/web/static/foo">
Order deny,allow
Deny from all
Allow from env=localreferer
</Directory>
答案3
该文件应通过您的应用程序提供,从磁盘读取其内容,然后将其传输给用户。但是,由于使用此方法会产生开销,因此许多人现在建议使用 Apache 的 mod_xsendfile。
总而言之,您需要修改您的应用程序来执行您想要的操作,但使用 mod_xsendfile 可以最大限度地减少需要对代码进行的更改量。
您可以参考以下链接作为指南:https://codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/