Имея огромный список перенаправления в .htaccess проблема? - PullRequest
5 голосов
/ 26 июля 2010

Я хочу перенаправить каждое сообщение 301 перенаправление, но у меня более 3000 сообщений.

Если я перечислю

Redirect permanent /blog/2010/07/post.html http://new.blog.com/2010/07/23/post/
Redirect permanent /blog/2010/07/post1.html http://new.blog.com/2010/07/24/post1/
Redirect permanent /blog/2010/07/post2.html http://new.blog.com/2010/07/25/post2/
Redirect permanent /blog/2010/07/post3.html http://new.blog.com/2010/07/26/post3/
Redirect per......

для более 3000 команд перенаправления URL-адресов в .htaccess - это может съесть ресурс моего сервера или вызвать какую-то проблему? Я не уверен, как работает .htaccess, но если сервер просматривает эти списки каждый раз, когда пользователь запрашивает страницу, я думаю, это будет источник ресурсов.

Я не могу использовать RedirectMatch, потому что я добавил переменную даты в свой новый URL. Есть ли у вас другие предложения по перенаправлению этих сообщений? Или я в порядке?

Спасибо!

Ответы [ 4 ]

7 голосов
/ 26 июля 2010

Я не эксперт по 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 для поиска дневного компонента сообщения.

У вас есть два варианта:

  1. Использовать хэш-карту для быстрого поиска в статическом файле.Это означает, что все ваши старые URL-адреса будут работать, но к любым новым сообщениям нельзя получить доступ, используя старую схему URL-адресов.
  2. Используйте сценарий для захвата дня.

В первом варианте создайтефайл с именем 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 влечет за собой расходы в оба конца, что увеличивает задержку загрузки страницы.

1 голос
/ 26 июля 2010

Это ... много перенаправлений.Но первое, что я хотел бы сказать вам, и, вероятно, единственное, что я могу сказать вам без квалификации, это то, что вы должны выполнить несколько тестов и посмотреть, каково время доступа для вашего блога, а также посмотреть на использование процессора и памяти сервера.пока ты это делаешь.Если они довольно низкие даже с этим гигантским списком переадресаций, все в порядке, если ваш блог не испытывает внезапного увеличения трафика.(Я сильно подозреваю, что 3000 переписываний будут сильно замедлять работу Apache)

При этом я бы поддержал предложение Джоша о замене перенаправлений чем-то динамичным.Как сказал animuson, если вы хотите убрать день с URL, вам будет легко установить директиву RewriteRule для обработки перенаправления.В противном случае вы можете сделать это с помощью PHP-скрипта или вообще некоторого кода на любом языке сценариев, который вы (можете) использовать.Если вы используете один из популярных блоговых движков, он, вероятно, уже содержит код для этого.По сути, вы можете сделать что-то вроде

RewriteRule .* /blog/index.php

и просто позволить PHP-скрипту разобраться, какой пост был запрошен.У него есть доступ к базе данных, так что он сможет это сделать, и затем вы можете либо отобразить сообщение непосредственно из сценария PHP, либо восстановить исходное поведение перенаправления, вы можете отправить заголовок Location с правильным URL-адресом..

В качестве альтернативы можно использовать RewriteMap, что позволяет записать RewriteRule, где цель определяется программой или файлом по вашему выбору, а не указывается непосредственно вфайл конфигурации.В качестве одного из вариантов вы можете указать текстовый файл, который содержит старый и новый URL, и Apache будет обрабатывать поиск файла для соответствующей строки для любого данного запроса.Прочитайте документацию (ссылка выше) для получения полной информации.Я упомяну, что это используется не очень часто, и я не уверен, насколько быстрее это будет по сравнению с просто 3000 перенаправлений.

Последний совет: Apache может быть значительно быстрее, если вы можетепереместить директивы конфигурации (например, Redirect) в файл конфигурации сервера или виртуального хоста и полностью отключить чтение .htaccess.Я предполагаю, что перемещение 3000 директив из .htaccess в конфигурацию виртуального хоста может значительно ускорить работу вашего сервера.Но даже перемещение директив в конфигурационный файл vhost, вероятно, не приведет к такому ускорению, как использование одного RewriteRule.

1 голос
/ 26 июля 2010

Если у вас есть какой-то способ в коде определить день публикации, вы можете сгенерировать переписывание на лету.Вы можете установить шаблон mod_rewrite, что-то вроде .html и настроить шаблон фронт-контроллера , чтобы вычислить новый URL из старого и выдать заголовок 301.

На примере php

$_SERVER['REQUEST_URI']

будет содержать запрошенный URL, а

header("Location: http://new.blog.com/$y/$m/$d/$title/",TRUE,301);

отправит перенаправление.

0 голосов
/ 26 июля 2010

Никогда не стоит создавать огромный список редиректов.Лучший способ программирования - просто перенаправить страницы без этой переменной даты, а затем создать небольшой фрагмент кода PHP, который определяет, отсутствует ли он, и перенаправляет на URL-адрес с включенным в него URL.Длинный список выглядит липким и замедляет работу Apache, потому что он проверяет этот URL (любой другой URL, на который это может даже не повлиять) в каждой строке.Если бы это было только 5 или около того, я бы сказал, хорошо, но 3000 - это определенное НЕТ.

Хотя я не большой поклонник этого метода, выбор лучше будетчтобы перенаправить все эти URL-адреса, как правило, с помощью одного оператора сопоставления, перенаправить их на страницу без части даты или с тире или чем-то еще, а затем включить небольшой фрагмент PHP, чтобы проверить, является ли дата действительной, и, если нет, переписать путь снована правильно сформированный URL.

Честно говоря, если у вас не было этой части раньше, она вам сейчас не нужна, и это, вероятно, просто запутает поисковые системы, меняющие URL для 3000 сообщений.Вам не нужно указывать дату в URL, хороший заголовок гораздо более значим не только для пользователей, но и для поисковых систем, чем набор цифр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...