我有一个 Apache 反向代理,目前正在为一些网站提供反向代理。但是我现在要添加一个新网站(我们称之为 newsite.com),该网站只能由某些 IP 访问。使用 Apache 作为反向代理可以做到这一点吗?
我对要代理的站点使用 VirtualHosts。我尝试将 Allow/Deny 指令与 Location 语句结合使用。例如:
<VirtualHost *:80>
Servername newsite.com
<Location http://newsite.com>
Order Deny,Allow
Deny from all
Allow from x.x.x.x
</Location>
<IfModule rewrite_module>
RewriteRule ^/$ http://newsite.internal.com [proxy]
</IfModule>
我还尝试在代理指令中为网站专门配置允许/拒绝,例如
<Proxy http://newsite.com/>
Order deny,allow
Deny from all
Allow from x.x.x.x
</Proxy>
但是,对于其余的代理站点,我仍然有这个定义。
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
无论我做什么,它似乎都可以从任何地方访问。这是因为所有其他代理站点的定义。它应用代理指令的顺序是什么?我在 * 之前和之后都有 newsite,在 VirtualHost 语句中也有。
答案1
您正在使用服务器名称和服务器别名用于匹配新闻网站。
你应该不是使用反向代理配置指令:
<Proxy whatever>
你应该使用:
对于 Apache 2.2:
<Location />
Order Deny,Allow
Deny from all
Allow from x.x.x.x
</Location>
对于 Apache 2.4:
<Location />
<RequireAny>
Require ip x.x.x.x/255.255.255.0
Require ...
</RequireAny>
</Location>
完成 Authz 后,您只需执行 ProxyPass 和 ProxyPassReverse(用于 302,301 重定向):
ProxyPass / http://newsite.com/
ProxyPassReverse / http://newsite.com/
请记住,您需要将 newsite.com 添加到您的 /etc/hosts 中,或者 DNS 应解析 URL 中的主机。您也可以仅使用 IP 地址,但您应该指示 httpd 服务器使用以下命令保留“Host:”标头:
ProxyPreserveHost On
答案2
今天遇到了类似的问题;与通配符匹配的方式有关,我认为它使用了完整的 URL:就我而言
<Proxy /jira*>
Order allow,deny
Deny from all
</Proxy>
ProxyPass /jira https://myhost.com
但这不起作用。网站可以从任何地方访问。我尝试了几种方法,找到了一个可用的版本:
<Proxy *jira*>
因此,在你的情况下尝试
<Proxy http://newsite.com*>
以确保 apache 匹配该 url。
答案3
<VirtualHost *:80>
Servername newsite.com
<Proxy *>
Order Deny,Allow
Deny from all
Allow from x.x.x.x
</Proxy>
ProxyPass / http://newsite.com/
ProxyPassReverse / http://newsite.com/
</VirtualHost>