我有一个公共网站,其中包含一些仅供私人/内部使用的 URL/目录。这些私人区域只能通过特定的 IP 地址或已知的用户名/密码访问。
目前我通过 .htaccess 文件实现这一点,如下所示:
AuthType Basic
AuthName "Protected Area"
AuthUserFile /path/to/.htpasswd
SetEnvIf Remote_Addr 1.2.3.4 trusted
SetEnvIf X-Forwarded-For 1.2.3.4 trusted
# (Note I am aware X-Forwarded-For can be spoofed)
<RequireAny>
Require env trusted
Require valid-user
</RequireAny>
问题是我想在我的服务器前面添加 Varnish 以提供缓存。显然,现有设置不适用于 Varnish,因为它无法以这种方式缓存受 .htaccess 文件限制的内容。
有没有办法我可以继续使用我的 .htaccess 文件来保护我的内部页面,或者我可以使用类似的方法来将安全责任放在 Varnish 本身上,它不需要每次我想要更改 Varnish 的 VCL 文件添加或修改限制?
您绝对可以通过编写以下 VCL 在 Varnish 中做到这一点:
限制
虽然这工作正常,但用户名/密码检查是手动完成的。如果您有多个用户名/密码,则必须在 if 语句中添加每个用户。
确保绕过默认的 VCL 行为
Authorization
在 Varnish 中处理标头时,重要的是不要依赖默认行为。默认情况下,当Authorization
标头存在时,Varnish 不会在缓存中查找项目。因此,在您的逻辑中的某个时刻,您必须执行
return (hash);
我在示例中执行的操作。否则,您将使用默认行为,并且不会在缓存中查找项目。Vmod_basicauth 作为替代
如果事实证明这是一个交易破坏者,您可以编译以下 Varnish 模块,该模块允许您加载
.htpasswd
文件并为您执行身份验证。仍然在 Apache 中做这一切
如果您决定继续在 Apache 中执行此操作,则还需要更改 VCL。
Authorization
我解释说,当标题存在时,默认行为将阻止 Varnish 在缓存中查找项目。如果您再次查看默认行为,则必须确保 a
return (hash);
在您遇到默认行为之前执行,或者您必须通过添加必要的if 语句自行重新实现其中的一部分