我所在的组织正在实施新的 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 ^(/.*) ...