我正在将类似代理的短域名与我的网站结合使用。短域名为hrci.me,长域名为reachchallenges.infectionist.com。 hrci.me使用mod_rewrite并有一条规则,即从hrci.me到重定向challenges.infectionist.com的重定向非常简单,例如:

hrci.me/x/y.php

将重定向到
reachchallenges.infectionist.com/x/y.php

可以很简单。在主站点上,我有更多规则可以进一步重写URL,以美化它。一个示例是我网站上的脚本Challenge.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.me重定向到的URL首先被重写为上面的#2,因此用户单击hrci.me/ch123,htaccess文件将读取在数据库中,获取挑战ID 123的标题,将URL重写为/challenge/123/Challenge+Title/,然后将其重定向到reachchallenges.infectionist.com。这样的事情可能吗?是否可以通过htaccess从MySQL数据库读取?

UPDATE :
我将此添加到我的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添加到我未真正使用的子域之一(进行测试):
RewriteEngine On
RewriteRule ^ch([0-9]{1,4})(/)?$ http://reachchallenges.infectionist.com/challenge/$1/${hrci:$1} [R=301,L]

当我在子域上访问此路径时:

/ch232

它应该重定向到:

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

但是,它重定向到:

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}

10-07 18:55