Диспетчеризация с Catalyst в FastCGI под Apache

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

У меня есть полный контроль над компьютером, на котором работает внешний сервер FastCGI, но у меня нет доступа к компьютеру, на котором работает Apache. Единственный способ, которым я могу "настроить" сервер, - это отправить заявку в службу поддержки, спросив "Не могли бы вы, ребята, попробовать добавить эти две строки в конфигурацию Apache?" И надеяться на лучшее.

Пока что я попросил их попробовать эту конфигурацию:

Alias /myapp/ /tmp/myapp.fcgi
FastCgiExternalServer /tmp/myapp.fcgi -host myserver:3010

Но, конечно, это работает, если кто-то подключается к http://theirserver/myapp, но я не могу использовать http://theirserver/myapp/controller/action/etc с этой конфигурацией.

Итак, вот мой многочастный вопрос:

  1. Есть ли простой способ настроить Apache таким образом, чтобы я мог использовать лучшую диспетчеризацию, и, возможно, даже цепочки - т.е. не иметь Alias для каждого возможного контроллера - действие?

  2. Если это невозможно, это означает, что доступен только запрос. Какова наилучшая практика для отправки запроса в Catalyst при таких обстоятельствах?

1 ответ

Я нашел то, что для меня является приемлемым решением, но я все еще ищу лучшие практики в конфигурации Apache или диспетчеризации Catalyst-as-external-FastCGI. В любом случае, ответьте на вопрос, если вы знаете лучший способ!

Модуль Catalyst::ActionRole::QueryParameter позволяет обрабатывать запросы на основе параметров запроса. Я был в состоянии использовать его для создания контроллера, который выглядит следующим образом:

package MyApp::Controller::Root;

use Moose;
use namespace::autoclean;

BEGIN { extends 'Catalyst::Controller::ActionRole'; }

__PACKAGE__->config(
    namespace    => '',
    action_roles => ['QueryParameter'],
);

sub default :Path {
  my ( $self, $c ) = @_;
  $c->response->body('no action specified!');
}

sub login :Path :QueryParam('action:eqlogin') {
    my ( $self, $c ) = @_;
    $c->response->body('login')
}

sub logout :Path :QueryParam('action:eqlogout') {
    my ( $self, $c ) = @_;
    $c->response->body('logout')
}

__PACKAGE__->meta->make_immutable;

1;

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

На момент написания этого, сравнение строк не работает в этом модуле, поэтому использование этого решения, вероятно, означает применение небольшого патча к QueryParameter.pm, как предлагается в этом сообщении об ошибке.

Другие вопросы по тегам