![使用 apache 2.4.x .htaccess 限制对特定 http_host 的访问](https://linux22.com/image/784830/%E4%BD%BF%E7%94%A8%20apache%202.4.x%20.htaccess%20%E9%99%90%E5%88%B6%E5%AF%B9%E7%89%B9%E5%AE%9A%20http_host%20%E7%9A%84%E8%AE%BF%E9%97%AE.png)
我想知道是否有人知道如何使用 .htaccess 解决我所面临的这种困境。
我有一个可以使用 2 个不同域名访问的网站。对于其中一个域名,我只想让一部分 IP(大约 30 个)可以访问该网站。第二个域名可以向任何人开放。
例如:
restricted.domainexample.com can only be accessible from IPs 1.1.1.1, 2.2.2.2, 3.3.3.3
www.domainexample.com can be accessible from everyone.
我有以下内容,但不确定这是否会起作用。这是正确的方法吗?
RewriteEngine on
RewriteCond %{HTTP_HOST} ^restricted\.domainexample\.com$ [NC]
order deny,allow
deny from all
allow from 123.12.12.12
allow from 123.123.43.43
RewriteRule ^(.*)$ - [F]
当然www.domainexample.com此处未受影响,因此所有人仍应拥有完全访问权限。任何意见和帮助都将不胜感激。
答案1
您不能像这样混合使用 mod_rewrite 和 mod_access_compat(在 Apache 2.4 上为Order
、Deny
、Allow
)。但是您无论如何都不应该在 Apache 2.4 上使用 mod_access_compat - 因为这些指令已被弃用(因此它们已从 mod_authz_host 移至 mod_access_compat)。
您也不需要 mod_rewrite。您可以改用 Apache<If>
表达式(需要 Apache 2.4)来检查Host
标头和 mod_authz_core。例如:
<If "%{HTTP_HOST} =~ /(?i)^restricted\.domainexample\.com/">
Require ip 1.1.1.1
Require ip 2.2.2.2
Require ip 3.3.3.3
: etc.
</If>
指令块Require
隐式包含在<RequireAny>
容器中(默认行为)。
或者,如果仅使用 mod_rewrite(Apache 2.2+)来执行此操作,则可以这样做:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^restricted\.domainexample\.com [NC]
RewriteCond %{REMOTE_ADDR} !=1.1.1.1
RewriteCond %{REMOTE_ADDR} !=2.2.2.2
RewriteCond %{REMOTE_ADDR} !=3.3.3.3
: etc.
RewriteRule ^ - [F]
mod_rewrite 规则的逻辑与第一个示例中的指令本质上相反Require
。使用 mod_rewrite 规则,当所有状况成功(即当没有 IP 地址匹配时)。而在第一个示例中,只要有任意一个 IP 地址匹配,即可授予访问权限。