使用DBM RewriteMap重写成千上万的传统URL

我正在努力的组织正在实施一个新的CMS。 因此,大量的URL(比方说成千上万)将被重写为新的。 它们中的一些可能被302'ed到新的URI模式,如:

RewriteRule ^/articles/articlename.html /new/article/taxonomy/and/such.html [R,L] 

其他人,我们将要传递到CMS后端,以便最终用户看到相同的URL,虽然它是从内部的新path提供的,例如

 RewriteRule ^/articles/article2.html /content/en/new/article/path/article2.html [PT,L] 

我打算把它放在一对FAT DBM rewritemaps中,以便分别处理这两种types,但要比把它们放在那里作为数千个单独的重写规则更快。

我不清楚,如何调用这些,以便mod_rewrite只拾取任何与DBM文件中的键匹配的URL,然后用值replace它。

 RewriteEngine on RewriteMap 302_rewrites dbm:/etc/httpd/conf/rewritemaps/dbmtest_302.dbm RewriteRule ^${302_rewrites:$1} ${302_rewrites:$2} [R,L] 

以上不起作用。 但是我接近?

你不能在RewriteRule的左边(匹配)使用你的RewriteMap 。 另外,由于在这一点上没有发生匹配,因此$1没有任何东西。 您可以在RewriteRule指定一个默认值,如下所示:

 RewriteRule ^(/articles/.*) ${302_rewrites:$1|$1} [R,L] 

这将查找数据库中的请求path( /articles/mumble/... ),如果没有find,它将返回原始path。 如果不是所有事情都以/articles开头,那么显然你的比赛会更加普遍:

 RewriteRule ^(/.*) ...