Когда редирект в Apache отказывается работать c первого раза

  Автор: © Mark Nielsen
Перевод: © Павел Ступин (Кобальт)


 

Содержание

  1. Ссылки
  2. Вступление
  3. Проблема с редиректом
  4. Использование Perl-скрипта
  5. Использование модуля Apache mod_rewrite
  6. Использование редиректа с виртуальным хостом
  7. Заключение

 

Ссылки

 

Вступление

Apache - это проект, который развивается уже в течение многих лет. Я лично просто поражен мощью, гибкостью и легкостью настройки (для программиста), которыми обладает Apache. Ни один из коммерческих вебсерверов не может сравниться с Apache по количеству написанной документации. Работа с Apache - это настоящее удовольствие для программистов. Ведь Apache открывает новые горизонты для деятельности.

Вместе с развитием проекта появляются новые способы решения проблем без ущерба для старых. У меня возникла проблема с машиной на gnujobs.com. Описывая ситуацию в общих чертах, мне нужно было пересылать каждый запрос к 'http://www.tcu-inc.com/mark/articles/' на 'http://www.gnujobs.com/Articles'. Я попробовал использовать директиву Apache 'Redirect', но это не сработало. Тогда мне пришлось выяснять, почему директива не работает и есть ли какие-то способы решения проблемы.

 

Проблема с Redirect

Проблема заключается в том, что директива 'Redirect' не сработала, когда я попытался устроить форвардинг запросов с 'http://www.tcu-inc.com/mark/articles/' на 'http://www.gnujobs.com/Articles'. Потребность в перенаправлении была вызвана тем, что оба сайта находились на одной и той же машине. Однако, как выяснилось позже, решение проблемы было очевидным (стоило мне немного подумать): я просто неправильно использовал 'Redirect'.

Тем не менее, эта проблема заставила меня по-новому взглянуть на mod_rewrite. В итоге у меня появилось 3 решения проблемы:

  1. Использовать Perl-скрипт.
  2. Использовать mod_rewrite с виртуальным хостом.
  3. Правильно использовать Redirect с виртуальным хостом.

 

Использование Perl-скрипта с виртуальным хостом.

Это было первое, что пришло мне в голову, после того, как я обнаружил, что мне не удалось заставить работать Redirect так, как нужно. Единственной причиной, побудившей меня прибегнуть к этому решению, было то, что это не требовало много времени и особой красоты. На самом деле, это, конечно, не так-то и просто, если вы не знакомы с программированием на Perl, не знаете, что такое 'Location', и как заставить выполняться Perl-скрипт на сервере с Apache. Но для меня, который до этого делал подобные вещи миллион раз, это было достаточно просто.

Что точно является достоинством этого решения, так это то, что нет необходимости перекомпилировать Apache. Необходимо только внести небольшие изменения в конфигурацию. Нет необходимости устанавливать mod_perl, но если вы все-такие сделали это то нужно изменить конфигурацию, если вам нужно кэширование Perl-скрипта. Также, все это можно сделать и на каком угодно другом языке программирования - без привязки к Perl.

Мне пришлось несколько изменить httpd.conf:

ServerAdmin info@gnujobs.comServerName www.tcu-inc.comDocumentRoot /www/htdocs/ScriptAlias /mark/articles "/www2/TCU.pl"

ScriptAlias - является здесь ключевым моментом. Он перенаправляет все запросы с /mark/artilces на Perl-скрипт TCU.pl

Сам скрипт выглядит следующим образом:

#!/usr/bin/perlprint "Location: http://www.gnujobs.com$ENV{'REQUEST_URI'}";

Здесь ключевым моментом является $ENV{'REQUEST_URI'} Это переменная среды, значение которой равно имени файла, запрашиваемого на www.tcu-inc.com Скрипт берет запрашиваемый файл и потом перенаправляет браузер на новый сайт. Также, чтобы быть уверенным в том, что файл скрипта является запускаемым, я сделал 'chmod 755 TCU.pl' для файла скрипта.

 

Использование модуля Apache mod_rewrite

Аарон Буш из COLUG побудил меня решить проблему, используя mod_rewrite. Мне не нравилось мое решение на Perl, и я знал, что могу использовать вместо Perl mod_rewrite, но мне было просто лень заниматься этим. Я знал, что мне следовало бы воспользоваться mod_rewrite, и тут еще Аарон сказал мне: "А почему ты не воспользовался mod_rewrite?" Борясь со своей ленью, я приходил к пониманию того, что испытания именно такими ситуациями проводят грань между мальчишками и настоящими мужчинами. Поэтому я сказал себе: "Я разберусь с этим. Я давненько не пользовался mod_rewrite, но сейчас я сделаю все как надо."

Для того, чтобы воспользоваться этим решением, нужно при сборке Apache включить mod_rewrite. Mod_rewrite является замечательным модулем, который "предоставляет основанный на правилах механизм динамического изменения запрашиваемых URL-ов". Это действительно мощный инструмент, и поэтому его знание принципиально важно, если вы хотите стать подлинным вебмастером или веб-программистом. Не столько принципиально, будете ли вы использовать его в своей работе, сколько важно то, что вы знаете, что он может делать, и сможете поведать об этом своему боссу, когда появится желание сделать что-нибудь странное с вебсервером.

Я пересобрал Apache с поддержкой mod_rewrite и прописал в httpd.conf:

ServerAdmin info@gnujobs.comServerName www.tcu-inc.comDocumentRoot /www/htdocs/RewriteEngine onRewriteCond %{HTTP_HOST} ^www\.tcu\-inc\.com$RewriteRule ^(/articles)(.*) http://www.gnujobs.com/Articles$2 [R]

RewriteCond устанавливает условие, при котором задействуется mod_rewrite, что, кратко говоря, значит: "обрати внимание на вебсервер, если www.tcu-inc.com являтся именем основного вебсайта". RewriteRule принимает условия (все на www.tcu-inc.com) и говорит, что если имя запрашиваемого файла начинается с "/articles", то тогда осуществляется редирект на www.gnujobs.com. "$2" относится к "(.*)". Все, что находится в имени запрашиваемого файла после "/articles", равно "(.*)". [R] означает "ОК. Есть совпадение. Делаем редирект."

 

Использование Redirect с виртуальным хостом.

После того, как были найдены уже описанные два решения, я понял, что делал ошибку используя Redirect. Я не прописал команду Redirect в секции VirtualHost. После того, как я сделал это, все заработало без проблем.

ServerAdmin info@gnujobs.comServerName www.tcu-inc.comDocumentRoot /www/htdocs/Redirect /mark/articles http://www.gnujobs.com/Articles

 

Заключение.

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

  1. Если в ближайшем будущем вы не планируете обзавестись командой програмистов для работы вебсайта, то используйте стандартную команду Redirect.
  2. Если вы программист или настоящий вебмастер, вам рекомендуется использовать mod_rewrite. Если вы сделаете mod_rewrite стандартом в своей работе, то вполне возможно, что вы сможете позже извлечь и другую пользу из использования mod_rewrite, о которой вы даже не подозревали сначала (разумеется, если вы раньше не работали с этим модулем).
  3. Я, честно говоря, не могу придумать причин, по которым использование Perl было бы оправдано в данном случае. Может быть только для ведения статистики (хотя это можно сделать и без Perl), ну или если вам хочется чего-нибудь странного. Использование Perl создаст больше проблем, чем принесет пользы. Если вы использовали mod_perl, то, вероятно, повысилась интенсивность использования памяти, необходимой для кэширования. Я бы не стал использовать Perl-скрипт здесь, хотя это и было моим первым решением, которое работало. Плохие решения тем-то и хороши, что они просто работают.

 

Марк работает независимым консультантом, уделяющим время проектам типа GNUJobs.com, сочиняя статьи и программируя свободное программное обеспечение.

 


Copyright © 2000, Mark Nielsen.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 61 of Linux Gazette, January 2001

Вернуться на главную страницу