2010-02-10 6 views
1

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

Применение случай:

Наследства сайт, который использует DirectoryIndex для обслуживания index.html (или аналогичный) и по умолчанию обработчиков для PERL скриптов и т.д., в настоящее время дан посвежевший url-схема (django/catal-ish). Диспетчер будет иметь набор URL-адресов, сопоставленных с контроллерами , которые отправляются на основе на входящий адрес.

Однако хитрая часть оказывает это диспетчер в том же пространстве имен на тот же виртуальный хост в качестве старого сайта. Идея состоит в том, чтобы переписать сайт по частям, поскольку миграция «обновить все» не дает никаких шансов в тестировании производительности сайта с новой системой , и это невозможно из-за чистого размера .

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

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

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

ответ

1

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

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

Быстрое обновление этого для заинтересованных. Я добавил PerlTransHandler, чтобы указать на MyClass :: обработчик, в котором я проверяю все URL-адреса на $ r-> uri(). Если есть совпадение, выполните: $ r-> handler ('perl-script'); $ r-> set_handlers (PerlResponseHandler => sub {$ self-> dispatch();}); Возвращаемое значение зависит от желаемого поведения. Если нет совпадения, верните Apache2 :: Const :: DECLINED. – myme

0

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

Я думал о решении, которое вы предлагаете, но я не могу уклониться, чтобы решить, как его решить с помощью перезаписи. Сначала я думал о том, что диспетчер обрабатывает «все» запросы, но я думаю, что более разумно обрабатывать все «отсутствующие» запросы, то есть все запросы, не найденные ни с помощью DirectoryIndex, ни с явным обработчиком типа file/mime. Это означает, что Apache должен вызвать диспетчера в качестве последнего средства, в то время, когда он обычно дает 404. Затем, даже если диспетчер отклоняется, дается 404. – myme

+0

Я добавил пример предлагаемой конфигурации перезаписи – hurikhan77

Смежные вопросы