我正在尝试将特定 URL 限制为仅供网络外的特定 IP 地址使用。当外部用户尝试访问该 URL 而不是来自 IP 列表的用户时,他应该被重定向到主页。
这是我到目前为止尝试过的方法,但没有任何效果。最后一部分它将所有人重定向到主页,无论 IP 是什么。
<Location "/secret">
# <If "%{REMOTE_ADDR} != -ipmatch '123.123.123.123/255.255.255.255'">
# Redirect 303 "/secret" /
# </If>
RewriteCond "%{REMOTE_ADDR}" "!123\.123\.123\.123"
RewriteRule .* / [R,L]
LogLevel debug rewrite:trace6
</Location>
PS:/secret URL 实际上是一个虚拟 URL,在驱动器上并不物理存在。
答案1
用于Require [ip|host|env]
指定谁有权访问您的虚拟主机或位置。
<Directory "/docroot">
Require ip 10.10.11.12
</Directory>
当谈到重定向时,考虑一下自定义错误页面。这更为普遍,因为每个未经授权的访问都会引发 403 错误,因此可以轻松进行评估。
我从未在 apache 上这样做过,但在 nginx 上使用了这种策略。对于 apache,应该这样做:
ErrorDocument 403 http://homepage.example.com
自定义错误文档使用 ErrorDocument 指令进行配置,该指令可用于全局、虚拟主机或目录上下文。如果 AllowOverride 设置为 FileInfo,则可在 .htaccess 文件中使用。(来自 apache 文档)
答案2
在 Apache 2.4 中,Order、Deny 和 Allow 选项已被替换为
<Directory /var/www/mysite.com/htdocs/public>
Require all granted
</Directory>
您可以通过使用以下命令明确限制地址:
<Directory /var/www/mysite.com/htdocs/public>
Require all granted
Require not ip 192.168.0.1
</Directory>
完全相反的情况也是如此,为了限制所有内容并仅允许子集使用以下命令:
<Directory /var/www/mysite.com/htdocs/public>
Require host example.com
Require ip 192.168.0.1
</Directory>
更多信息请访问Apache 2.4 访问控制文档。
关于您的问题(由于缺少要点来添加评论,因此我编辑了我自己的问题),您应该能够简单地设置一个 ErrorDocument,并将索引设置为 URL 路径:
<Directory /var/www/mysite.com/htdocs/public>
Require host example.com
Require ip 192.168.0.1
ErrorDocument 401 /index.html
</Directory>
希望这可以帮助!
答案3
对于 Apache 2.4,您可以使用 <RequireAny>。您可以在 vhost 或 .htaccess 文件中执行此操作....
SetEnvIF IP xxx.xxx.xxx.xxx AllowThisIP # Or X-Real-IP
SetEnvIF IP yyy.yyy.yyy.yyy AllowThisIP
<RequireAny>
Require env AllowThisIP
Require host example.com
</RequireAny>
Apache 文档https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#requireany