Назад | Перейти на главную страницу

Использование DBM RewriteMap для перезаписи тысяч устаревших URL-адресов

Организация, в которой я работаю, внедряет новую 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 ^(/.*) ...