使用 apache 2.4.x .htaccess 限制对特定 http_host 的访问

使用 apache 2.4.x .htaccess 限制对特定 http_host 的访问

我想知道是否有人知道如何使用 .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 上为OrderDenyAllow)。但是您无论如何都不应该在 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 地址匹配,即可授予访问权限。

相关内容