Я не эксперт по Apache, поэтому я не могу сказать, является ли наличие 3000 перенаправлений в .htaccess проблемой (хотя моя интуиция говорит мне, что это, вероятно, плохая идея).Однако, в качестве более простого решения вашей проблемы, почему бы не использовать mod_rewrite для перенаправления?
RewriteRule ^/blog/(.+)/(.+)/(.+).html$ http://new.blog.com/$1/$2/$3/ [R=permanent]
При этом используется регулярное выражение для сопоставления старых URL-адресов и перезаписи их на новые.[R=permanent]
инструктирует mod_rewrite выдавать 301 с новым URL-адресом, а не перезаписывать запрос внутренне.
В вашем примере выглядит так, как будто вы добавили день публикации в URL, чтоне существует в старом URL.Поскольку вы, очевидно, не можете использовать регулярное выражение для определения дня, когда был сделан произвольный пост, этот метод может не сработать для вас.Если вы можете пропустить день с URL-адреса, тогда все готово.
Редактировать : Когда я впервые прочитал ваш вопрос, я пропустил последний абзац.(«Я не могу использовать RedirectMatch, потому что я добавил переменную даты в свой новый URL-адрес.») В этом случае вы можете использовать mod_rewrite RewriteMap для поиска дневного компонента сообщения.
У вас есть два варианта:
- Использовать хэш-карту для быстрого поиска в статическом файле.Это означает, что все ваши старые URL-адреса будут работать, но к любым новым сообщениям нельзя получить доступ, используя старую схему URL-адресов.
- Используйте сценарий для захвата дня.
В первом варианте создайтефайл с именем posts.txt и положил:
/yyyy/mm/pppp dd
... для каждого сообщения, где yyyy - год сообщения, mm - месяц, а pppp - имя сообщения (без .html)..
Когда вы закончите, запустите:
$ httxt2dbm -i posts.txt -o posts.map
Затем мы добавим в конфигурацию сервер / виртуальный сервер: (Обратите внимание, что путь - это файловая система путь, а не URL.)
RewriteMap postday dbm:/path/to/file/posts.map
RewriteRule ^/blog/(.+)/(.+)/(.+).html$ http://new.blog.com/$1/$2/${postday:$1/$2/$3}/$3/ [R=permanent]
Во втором варианте используйте pgm:/path/to/script/lookup.whatever
в качестве RewriteMap.См. документацию mod_rewrite для получения дополнительной информации об использовании скрипта.
Выполнение поиска в mod_rewrite лучше, чем просто перенаправление на скрипт, который ищет дату, а затем перенаправляет в конечный пункт назначения, потому что вы никогда не должны перенаправлять более одного раза .Выпуск 301 или 302 влечет за собой расходы в оба конца, что увеличивает задержку загрузки страницы.