我试图用Apache2 mod_rewrite控制访问。具体来说,我只想允许某些IP访问我的网站。
我知道我可以使用
这样的文件RewriteMap hosts-allow "txt:/path/to/hosts.txt"
我已经读过我也可以使用SQL查询,但显然它只适用于一个结果,如果返回多行,则它使用随机的一行。有没有办法使用多个结果?
否则,我是否必须自动将MySQL中的IP保存到文件中以便自己使用多个结果?
如果是,那么Apache2会在文件更改时自动刷新文件的缓存吗?
非常欢迎任何见解,谢谢:)
答案 0 :(得分:0)
我得到了它的工作。
如果您遇到类似的问题,那么您的Apache2文件000-default.conf(在Linux发行版中查找此文件的位置)必须如下所示。
<VirtualHost *:80>
DBDriver mysql
DBDParams "host=localhost,user=root,pass=password,dbname=name"
RewriteMap whitelist "dbd:SELECT ip FROM users WHERE ip = %h LIMIT 1"
<Directory /var/www>
RewriteEngine On
RewriteCond "${whitelist:%{REMOTE_ADDR}|FOUND}" "FOUND"
RewriteRule "^" "" [F]
</Directory>
...
</VirtualHost>
现在解释一下
RewriteMap whitelist "dbd:SELECT ip FROM users WHERE ip = %h"
此处的参数%h代表请求的IP地址,因此它不使用SQL查询的多个结果,但由于WHERE仅在满足条件时返回行,因此它可以适用于任何数量的IP。 / p>
RewriteCond "${whitelist:%{REMOTE_ADDR}|FOUND}" "FOUND"
:%{REMOTE_ADDR}在白名单中搜索REMOTE_ADDR,只有在找到SQL查询时才会包含IP地址,否则为空。
RewriteRule "^" "" [F]
这里[F]表示禁止,您可以将其设置为例如[R]重定向,但您必须查找有关如何使用它的更多信息,“^”表示此规则适用于所有网址。
空的“”是Apache2在.txt映射中所期望的关键分隔符(?),但由于我们使用SQL查询,所以我们在这里没有。
如果你想使用mod_dbd和MySQL,你必须安装一个包(例如在Debian 8上)
sudo apt-get install libaprutil1-dbd-mysql
否则在将DBDriver设置为mysql后,Apache2将无法启动
您还必须使用
在Apache2中启用mod_rewrite和mod_dbda2enmod rewrite
a2enmod dbd
希望这对某人有帮助:)。