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