我可以在Apache2 mod_rewrite中使用MySQL查询的多个结果吗?

时间:2017-04-07 10:01:29

标签: mysql apache .htaccess mod-rewrite

我试图用Apache2 mod_rewrite控制访问。具体来说,我只想允许某些IP访问我的网站。

我知道我可以使用

这样的文件
RewriteMap    hosts-allow  "txt:/path/to/hosts.txt"

我已经读过我也可以使用SQL查询,但显然它只适用于一个结果,如果返回多行,则它使用随机的一行。有没有办法使用多个结果?

否则,我是否必须自动将MySQL中的IP保存到文件中以便自己使用多个结果?

如果是,那么Apache2会在文件更改时自动刷新文件的缓存吗?

非常欢迎任何见解,谢谢:)

1 个答案:

答案 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_dbd
a2enmod rewrite
a2enmod dbd

希望这对某人有帮助:)。

相关问题