Apache: Каков наилучший способ обработки тысяч постоянных перенаправлений?

20

У нас есть список из 3000 301 переадресаций. Нам нужна помощь по

  1. Что бы лучше всего поставить их? Кажется, что поместить эти 3000 строк в vhost в httpd.conf было бы беспорядком.
  2. Каковы рекомендуемые способы обработки тысяч URL-адресов?
  3. Насколько это повлияет на скорость загрузки страницы и нагрузку на сервер apache?

Благодарю.

ucker
источник

Ответы:

29

Вы можете использовать Includeдирективу in, httpd.confчтобы иметь возможность поддерживать перенаправления в другом файле. Но это было бы не очень эффективно, поскольку каждый запрос должен был бы проверяться по множеству регулярных выражений. Кроме того, перезагрузка сервера потребуется после каждого изменения в файле.

Лучшим способом для такого количества перенаправлений было бы использование директивы типа RewriteMapdbm для объявления карты от URI до перенаправлений. Таким образом, это будет эффективно, так как поиск в dbm выполняется очень быстро, и после изменения карты вам не нужно перезапускать сервер, так как httpdпроверяется время модификации файла карты.

Правила переписывания выглядят так (проверено на моем компьютере с Fedora 16):

RewriteEngine On
RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

И карта DBM будет создана из текстовой карты, которая /etc/httpd/conf/redirects.txtвыглядит следующим образом:

/foo http://serverfault.com/
/bar/lorem/ipsum/ http://stackoverflow.com/

используя команду

httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db
Tometzky
источник
Спасибо за ответ. Я пытался, но получал ошибки: содержимое моей однострочной версии redirects.txt (значения, разделенные пробелами) mydomain.com/experiment mydomain.com/new_page Это дало мне ошибку разбора в строке 'RewriteCond $ {redirects: $ 1}! = ""' , Синтаксическая ошибка в строке 314 /usr/local/apache/conf/httpd.conf: RewriteCond: разделители плохого флага Я закомментировал это, а затем запустил apache, но посещение mydomain.com/experiment (или любого другого URL-адреса из mydomain) дало мне ошибку msgstr "запрос перенаправлен так, что он не может быть выполнен".
Ucker
Apache не перезапускается с приведенным выше фрагментом. Не могли бы вы помочь? Я не вижу никакой ошибки, связанной с этим, ни в одном из файлов журнала.
Ucker
Я сказал, что это было непроверенным - я ожидал, что это потребует некоторой настройки. Я думал, что этого будет достаточно, извините. Httpd не запустился, так как не может быть пробела между !=и ""- я исправил мой пример до работающей и протестированной версии.
Томецкий
Еще один комментарий: вам нужно будет использовать другой подход, если ваши перенаправления должны зависеть от строк запроса (все после ?URL), но это также возможно . Как сейчас, он просто добавил бы строку запроса для перенаправления, например http://yourserver.com/foo?q=barперенаправил бы на http://serverfault.com/?q=bar.
Томецкий
Спасибо за обновление. RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.dbдал ошибку RewriteMap dbm type db is invalid. Но когда я использовал RewriteMap redirects txt:/etc/httpd/conf/redirects.txtэто сработало. Я все еще хочу использовать хешированный способ, как вы объяснили, вместо простого текста. Но я не мог найти много об ошибке DBM. Спасибо за вашу помощь.
Ucker
2

Я написал бы скрипт, который генерирует новый VHOST только с ссылками из списка.

Лукас Кауфман
источник