Apache RewriteMap与MySQL

时间:2020-03-05 15:24:17  来源:igfitidea点击:

apache rewritemap是Apache的一个极好的插件,它可以直接连接到数据存储并动态地提取数据。
因此,我们不必依赖于脚本语言(如PHP、Python)来为我们执行重写/重定向。
我们的用例是设置"反向代理",根据输入URI的参数值将请求重定向到不同的子域。
我们的子域数据存储在MySQL表中。
这就是我们所做的,

<VirtualHost *:80>
  RewriteEngine On
  DBDriver mysql
  DBDParams "host= host.localhost,user=admin,pass=password,dbname=someDB"
  RewriteMap data "dbd:select column from mytable where REPLACE(column,'www.','') = REPLACE(%s,'www.','')"
  RewriteCond ${data:%{HTTP_HOST}} ^\s*$
  #if we don't have match for the HOST, skip next rule as indicated
  RewriteRule ".?" "-" [S=1]
    #Else check for the matching records in our DB
    RewriteCond %{REQUEST_URI} ^/([^/]+)$
    RewriteMap myquery1 "dbd:select column from mytable where CONCAT(REPLACE(column,'www.',''),column2) = REPLACE(%s,'www.','')"
    RewriteCond  ${myquery1:%{HTTP_HOST}%1} ^(.+)$
    RewriteRule ^/(.*)$https://%1/ [P,L]

    RewriteRule ^ - [F]
</VirtualHost>

DBDriver和DBDParams是数据库连接设置。
我们可能需要启用rewritemap插件、dbd插件并安装一个合适的驱动程序。

sudo a2enmod dbd
sudo a2enmod rewrite_map
sudo apt-get install libaprutil1-dbd-mysql

rewritemap指令可以接收从RewriteCond传入的一个输入

RewriteCond ${data:%{HTTP_HOST}} ^\s*$

主机被传递到RewriteMap,并检查结果以查看它是否有一些数据。
如果没有,则跳过接下来的3条规则。
如果有,那么rewritemap查询的结果将作为$1作为RewriteCond输入RewriteRule。
最后一个是禁止返回。
注意,$1变量通常表示直接的父数据。

我们可以在RewriteMap中看到"dbd",它是一个"MapType"参数,它有另一个值"fastdbd"。
"fastdbd"缓存数据库查询结果,直到Apache服务器重新启动。
我们使用dbd,因为我们有动态数据流。

我们可以从中探索其他类似RewriteMap的文件支持选项https://httpd.apache.org/docs/2.4/rewrite/rewritemap.html