Apache mod_perl обработчик / диспетчер, возвращающий управление apache - PullRequest
1 голос
/ 10 февраля 2010

Возможно ли иметь обработчик apache mod_perl, который принимает все входящие запросы и на основе набора правил принимает решение, следует ли выполнять этот запрос, и если нет, возвращает управление apache, который будет обслуживать запрос как обычно?

Вариант использования:

Устаревший сайт, который использует DirectoryIndex для обслуживания index.html (или аналогичные) и обработчики по умолчанию для Perl-скрипты и т. д., получает обновленная URL-схема (Джанго / катализатор-МОГ). Диспетчер будет иметь набор URL, сопоставленных с контроллеры, которые отправляются на основе на входящий URL.

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

Одна из многих проблем заключается в том, что диспетчер теперь получает все URL-адреса, как и ожидалось, но DirectoryIndex и статический контент (который в основном обслуживается другим хостом, но не всем) не обслуживается должным образом. Диспетчер возвращает Apache :: Const :: DECLINED для несовпадающих URL-адресов, но Apache не продолжает обслуживать запрос, как обычно, а вместо этого выдает страницу ошибки по умолчанию. Apache, похоже, не пытается искать /index.html и т. Д.

Как это можно решить? Вам нужно использовать внутренние перенаправления? Менять стек обработчика в диспетчере? Используйте какие-нибудь умные директивы? Все вышеперечисленное? Не возможно вообще?

Все предложения приветствуются!

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

Я сделал нечто подобное, но некоторое время назад, поэтому я могу быть немного расплывчатым:

  • Я думаю, вам нужен стандартный обработчик файлов (я полагаю, что это делается с помощью директивы set-handler), а также обработчик perl в стеке
  • Возможно, вам понадобится PerlTransHandler или аналогичный, чтобы подключиться к фазе отображения имени файла / URL и убедиться, что следующий встроенный обработчик выберет нужный файл из файловой системы.
0 голосов
/ 10 февраля 2010

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

Это может быть достигнуто комбинацией RewriteCond и RewriteRule. Ваше новое приложение должно находиться в частном «пространстве имен» (местоположении), которое не использовалось ранее в старом приложении.

Я не эксперт по mod_perl, но, например, с mod_php это может работать так:

RewriteEngine on

# do not rewrite requests into the new application(s) / namespaces
RewriteRule ^new_app/ - [L]

# do not rewrite requests to existing file system objects
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

# do the actual rewrite here
RewriteRule ^(.*)$ new_app/dispatcher.php/$1
...