使用 DBM RewriteMap 重写数千个旧版 URL

使用 DBM RewriteMap 重写数千个旧版 URL

我所在的组织正在实施新的 CMS。因此,大量的 URL(比如说数万个)将被重写为新的 URL。其中一些 URL 可能会被 302 重定向到新的 URI 模式,例如:

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

其他的,我们希望传递到 CMS 后端,以便最终用户看到相同的 URL,尽管它是从内部的新路径提供的,例如

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

我计划将其放入一对 FAT DBM 重写映射中,以便分别处理这两种类型,但比将它们作为数千条单独的重写规则放入其中更快。

但是我不清楚如何调用这些,以便 mod_rewrite 只选择与 DBM 文件中的某个键匹配的任何 URL,然后用该值替换它。

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

上述方法无效。但我接近成功了吗?

答案1

您不能RewriteMap在 的左侧(匹配)使用 use your RewriteRule。此外,由于此时没有发生匹配,因此 中没有任何内容$1。您可以在 中指定默认值RewriteRule,如下所示:

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

这将在您的数据库中查找请求路径 ( /articles/mumble/...),如果未找到任何内容,它将返回原始路径。如果不是所有内容都以 开头,/articles您显然可以使您的匹配更加通用:

RewriteRule ^(/.*) ...

相关内容