Apache: Який найкращий спосіб обробляти тисячі постійних переадресацій?


20

У нас є список 3000 301 переадресацій. Нам потрібна допомога на

  1. Що б найкраще було розмістити? Здається, розміщення цих 3000 рядків всередині vhost в httpd.conf було б безладом.
  2. Які рекомендовані способи обробки тисяч URL-адрес?
  3. На скільки це вплине на швидкість завантаження сторінки та завантаження сервера apache?

Спасибі.

Відповіді:


29

Ви можете використовувати Includeдирективу, httpd.confщоб мати можливість підтримувати переадресації в інший файл. Але це було б не дуже ефективно, оскільки кожен запит потрібно було б перевірити на безліч регулярних виразів. Також потрібно буде перезапустити сервер після кожної зміни файлу.

Кращим способом для такої кількості переадресацій було б використовувати директиву типу RewriteMap типу, dbmщоб оголосити карту з 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

Дякую за відповідь. Я спробував це, але отримую помилки: мій вміст файлу перенаправляє один рядок (значення, розділені пробілом) mydomain.com/experiment mydomain.com/new_page Це дало мені помилку розбору в рядку 'RewriteCond $ {redirects: $ 1}! = ""' . Помилка синтаксису в рядку 314 /usr/local/apache/conf/httpd.conf: RewriteCond: погані роздільники прапора Я прокоментував це, а потім запущено апаш, але відвідавши mydomain.com/experiment (або будь-яку іншу URL-адресу з mydomain) дав мені помилку "запит перенаправляється таким чином, що його неможливо було виконати".
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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.