![Apache 2.4:按 IP 范围限制对反向代理的访问,并重定向来自所有其他主机的请求](https://linux22.com/image/229529/Apache%202.4%EF%BC%9A%E6%8C%89%20IP%20%E8%8C%83%E5%9B%B4%E9%99%90%E5%88%B6%E5%AF%B9%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E7%9A%84%E8%AE%BF%E9%97%AE%EF%BC%8C%E5%B9%B6%E9%87%8D%E5%AE%9A%E5%90%91%E6%9D%A5%E8%87%AA%E6%89%80%E6%9C%89%E5%85%B6%E4%BB%96%E4%B8%BB%E6%9C%BA%E7%9A%84%E8%AF%B7%E6%B1%82.png)
我们有一个前端代理服务器,为后端网站的页面提供服务(均运行 Apache 2.4):
# Apache config snippet from frontend server
SSLProxyEngine on
ProxyPass "/blah" "https://backend.invalid/blah"
ProxyPassReverse "/blah" "https://backend.invalid/blah"
(换句话说,访问以下任何内容https://frontend.invalid/blah实际上从后端站点检索内容。这按预期工作。)
为了在后端站点上进行一些维护工作,我现在只想允许从某些 IP 范围(例如Require ip 123.123 172.20.0.0/16
(等,对于多个范围))以及所有请求访问代理(和后端站点)不是在这些范围内,将这些请求重定向到具有状态页面的不同站点。
我怀疑这将需要一些相当复杂的mod_rewrite
配置(始终是“需要几杯咖啡”的任务)和/或可能使用If
和Else
指令。
有人能建议如何最好地(或者也许是最简单地)进行设置吗?
答案1
除非我在您的用例中遗漏了某些内容,否则您可能可以简单地使用<If>
带有-ipmatch
操作员,结合一个Redirect
操作说明。
<If "! ( %{REMOTE_ADDR} -ipmatch '172.20.0.0/16' )">
Redirect https://other.com/...
</If>
如果您需要打开发起请求的用户代理的原始 IP(而不是(可能)代理源 IP),则还要启用mod_remoteip模块并使用变量CONN_REMOTE_ADDR
代替REMOTE_ADDR
.
(……所以也许任务的时间仅仅够喝几口咖啡;)