Организация, в которой я работаю, внедряет новую CMS. Таким образом, огромное количество 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 собирал только те URL-адреса, которые соответствуют одному из ключей в файле DBM, и затем заменял его значением.
RewriteEngine on
RewriteMap 302_rewrites dbm:/etc/httpd/conf/rewritemaps/dbmtest_302.dbm
RewriteRule ^${302_rewrites:$1} ${302_rewrites:$2} [R,L]
Вышеуказанное не работает. Но близок ли я?
Вы не можете использовать свой RewriteMap
в левой части (совпадении) RewriteRule
. Кроме того, поскольку в этот момент совпадений не было, в $1
. Вы можете указать значение по умолчанию в RewriteRule
, как это:
RewriteRule ^(/articles/.*) ${302_rewrites:$1|$1} [R,L]
Это будет искать путь запроса (/articles/mumble/...
) в вашей базе данных, и если ничего не найдено, он вернет исходный путь. Если не все начинается с /articles
вы, очевидно, можете сделать свой матч более общим:
RewriteRule ^(/.*) ...