MySQL + htaccess的mod_rewrite?

我正在使用类似代理的短域名与我的网站一起使用。 短域名是hrci.me,长域名是reachchallenges.infectionist.com。 hrci.me使用mod_rewrite,并有一个规则,从hrci.me很简单的redirect到达challenges.infectionist.com,例如:

hrci.me/x/y.php 

会redirect到

 reachchallenges.infectionist.com/x/y.php 

尽可能简单。 在主站点上,我有更多的规则来进一步重写URL,对其进行美化。 一个例子是我的网站上的一个脚本,challenges.php,它接受一个参数chid ,这个参数是与数据库中更多信息相关的质询ID。 作为一个参数化的脚本,它看起来像这样: /challenge.php?chid=123 ,但重写后它看起来像这样: /challenge/123/Challenge+Title/ ,其中Challenge+Title是项目的实际标题从数据库。 还有一种不同的方式可以调用同一页面,如下所示: /ch123 ,所以本质上你可以通过3种不同的方式访问页面:

 1. /challenge.php?chid=123 2. /challenge/123/Challenge+Title/ 3. /ch123 

这实际上是完美的工作,我的问题是,我希望从hrci.meredirect的URL首先被重写成上面的#2,所以用户将点击hrci.me / ch123和htaccess文件将读取数据库,获得挑战ID 123的标题,重写URL到/challenge/123/Challenge+Title/然后redirect到达挑战.infectionist.com。 是这样的可能吗? 用这种方法是否可以使用htaccess从MySQL数据库中读取?

更新 :我添加到我的httpd.conf文件:

 DBDriver mysql DBDParams "host=*****,user=*****,pass=*****,dbname=*****" RewriteMap hrci "dbd:SELECT title FROM challenges WHERE id = %s" RewriteLog "/home/halo2freeek/rewrite.log" RewriteLogLevel 3 

然后添加一个RewriteRule到我没有真正使用的一个子域中(testing它):

 RewriteEngine On RewriteRule ^ch([0-9]{1,4})(/)?$ http://reachchallenges.infectionist.com/challenge/$1/${hrci:$1} [R=301,L] 

当我在子域上访问这个path时:

/ ch232

它应该redirect到:

http://reachchallenges.infectionist.com/challenge/232/Challenge+Title

但相反,它redirect到:

http://reachchallenges.infectionist.com/challenge/232/

没有标题。 难道我做错了什么? 我必须在httpd.conf文件中指定RewriteEngine On吗?

更新2 :好的,所以我添加了RewriteEngine On在线和保存,当我试图重新启动Apache时,我得到这个错误:

 RewriteMap: file for map hrci not found:/dh/apache2/apache2-ps54462/dbd:SELECT title FROM challenges WHERE id = %s 

它看起来像是完全忽略了dbd部分,并试图将整个事情作为文件名读取。 现在我真的不知道我做错了什么。

用RewriteMap一切都是可能的:

 RewriteMap examplemap prg:/path/to/file.php RewriteRule (.*) ${examplemap:$1} 

你也可以使用mod_dbd :

 DBDriver mysql DBDParams "host=localhost,user=db_user,pass=password,dbname=db" RewriteMap myquery "dbd:select new_url from rewrite where old_url = %s" RewriteRule (.*) ${myquery:$1}