MySQL + htaccess mod_rewrite?

HaL*_*eEk 5 mysql apache .htaccess mod-rewrite

我正在使用类似代理的短域与我的网站一起使用.短域是hrci.me,长域是reachchallenges.infectionist.com.hrci.me使用mod_rewrite并且有一个规则,它几乎可以从hrci.me重定向到challengechallenges.infectionist.com,例如:

hrci.me/x/y.php
Run Code Online (Sandbox Code Playgroud)

将重定向到

reachchallenges.infectionist.com/x/y.php
Run Code Online (Sandbox Code Playgroud)

很简单就可以了.在主站点上,我有更多规则可以进一步重写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
Run Code Online (Sandbox Code Playgroud)

这实际上是完美的,我的问题是我希望从hrci.me重定向的URL首先被重写为上面的#2,因此用户将单击hrci.me/ch123并且htaccess文件将读取数据库,获取挑战ID 123的标题,重写网址/challenge/123/Challenge+Title/,然后将其重定向到reachchallenges.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
Run Code Online (Sandbox Code Playgroud)

然后在我的一个子域中添加了一个RewriteRule,我并没有真正使用它(测试它):

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

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

/ ch232

它应该重定向到:

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

但相反,它重定向到:

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

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

更新2:好的,所以我添加了RewriteEngine On行并保存,当我尝试重新启动Apache时出现此错误:

RewriteMap: file for map hrci not found:/dh/apache2/apache2-ps54462/dbd:SELECT title FROM challenges WHERE id = %s
Run Code Online (Sandbox Code Playgroud)

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

san*_*mai 5

使用RewriteMap一切皆有可能:

RewriteMap examplemap prg:/path/to/file.php
RewriteRule (.*) ${examplemap:$1}
Run Code Online (Sandbox Code Playgroud)

你也可以使用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}
Run Code Online (Sandbox Code Playgroud)

  • 你只是忘了提到`RewriteMap`指令不能放在.htaccess中 - 只能在服务器配置/虚拟主机上下文中.如果OP无法编辑这些文件(例如,在共享主机上),那么对他来说就没用了. (2认同)