我正在将类似代理的短域名与我的网站结合使用。短域名为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}