Apache反向代理访问控制

9 reverse-proxy apache-2.2

我有一个 Apache 反向代理,目前正在为几个站点进行反向代理。但是,我现在要添加一个只能由某些 IP 访问的新站点(我们称之为 newsite.com)。使用 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>
Run Code Online (Sandbox Code Playgroud)

我还尝试在代理指令中为站点配置允许/拒绝,例如

<Proxy http://newsite.com/>
  Order deny,allow
  Deny from all
  Allow from x.x.x.x
</Proxy>
Run Code Online (Sandbox Code Playgroud)

但是,对于其余的代理站点,我仍然有这个定义。

<Proxy *>
  Order deny,allow
  Allow from all
</Proxy>
Run Code Online (Sandbox Code Playgroud)

无论我做什么,它似乎都可以从任何地方访问。这是因为所有其他代理站点的定义。是否有应用代理指令的顺序。我在 * 之前和之后都有 newsite ,也在 VirtualHost 声明中。

小智 5

您正在使用ServerNameServerAlias来匹配newsite.com。

应该将以下指令用于反向代理配置:

<Proxy whatever>
Run Code Online (Sandbox Code Playgroud)

你应该使用:

对于阿帕奇 2.2:

<Location />
Order Deny,Allow
Deny from all
Allow from x.x.x.x
</Location>
Run Code Online (Sandbox Code Playgroud)

对于阿帕奇 2.4:

<Location />
   <RequireAny>
       Require             ip x.x.x.x/255.255.255.0
       Require ...
   </RequireAny>
</Location>
Run Code Online (Sandbox Code Playgroud)

完成 Authz 后,您只需执行 ProxyPass 和 ProxyPassReverse(对于 302,301 重定向):

ProxyPass /  http://newsite.com/
ProxyPassReverse /  http://newsite.com/
Run Code Online (Sandbox Code Playgroud)

请记住,您需要将 newsite.com 添加到您的 /etc/hosts 中,或者 dns 应该解析 url 中的主机。您也可以仅使用 IP 地址,但您应该指示 httpd 服务器保留“Host:”标头:

ProxyPreserveHost On
Run Code Online (Sandbox Code Playgroud)


小智 1

今天有类似的问题;与通配符匹配的完成方式有关,我认为它使用完整的 URL:在我的例子中,我有

<Proxy /jira*>
  Order allow,deny
  Deny from all
</Proxy>
ProxyPass /jira https://myhost.com
Run Code Online (Sandbox Code Playgroud)

但这不起作用。可以从任何地方访问该网站。我尝试了一些事情并找到了一个工作版本:

<Proxy *jira*>
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下尝试

<Proxy http://newsite.com*>
Run Code Online (Sandbox Code Playgroud)

确保 apache 与该 url 匹配。