2010-02-10 3 views
1

Est-il possible d'avoir un gestionnaire apache mod_perl, qui reçoit toutes les demandes entrantes et décide en fonction d'un ensemble de règles si cette demande est quelque chose qu'il veut agir, et sinon, retourner le contrôle à Apache qui servirait la demande comme d'habitude?Apache mod_perl gestionnaire/répartiteur retournant le contrôle à apache

Un cas d'utilisation:

Un ancien site qui utilise DirectoryIndex pour servir index.html (ou similaire) et des gestionnaires par défaut pour scripts perl etc, est donné un rafraîchis url-scheme (django/catalyseur-ish). Un répartiteur aura un ensemble d'URL mappées aux contrôleurs qui sont répartis en fonction de sur l'URL entrante.

Cependant, la partie la plus délicate est d'avoir ce répartiteur dans le même espace de noms sur le même serveur virtuel que l'ancien site . La pensée est de réécrire le site morceau par morceau, comme une migration " " ne donne aucune chance de tester les performances du site avec le nouveau système, n'est pas possible en raison de la taille pure du site.

L'un des nombreux problèmes, est que le répartiteur reçoit maintenant toutes les URL comme prévu, mais DirectoryIndex et le contenu statique (qui est la plupart du temps servi par un hôte différent, mais pas tout) n'est pas servi correctement. Le dispatcher renvoie un Apache :: Const :: DECLINED pour les URL non concordantes, mais Apache ne continue pas à répondre à la demande comme il le ferait normalement, mais donne la page d'erreur par défaut. Apache ne semble pas essayer de rechercher /index.html etc.

Comment cela peut-il être résolu? Avez-vous besoin d'utiliser des redirections internes? Changer la pile du gestionnaire dans le répartiteur? Utilisez des directives intelligentes? Tout ce qui précède? Pas possible du tout?

Toutes les suggestions sont les bienvenues!

Répondre

1

Je l'ai fait une chose semblable, mais un certain temps, donc je pourrais être un peu vague:

  • Je pense que vous devez avoir le gestionnaire de fichiers standard (je crois que cela est fait en utilisant la directive set-handler) ainsi que le gestionnaire perl dans la pile
  • Vous devrez peut-être utiliser PerlTransHandler ou un similaire pour brancher le nom du fichier/la carte d'url Ping phase et assurez-vous que le prochain gestionnaire en ligne choisira le bon fichier sur le système de fichiers.
+2

Une mise à jour rapide à ce sujet pour ceux qui sont intéressés. J'ai ajouté un PerlTransHandler pour pointer vers MyClass :: handler, dans lequel je vérifie toutes les URLs par rapport à $ r-> uri(). S'il y a une correspondance, faites: $ r-> handler ('perl-script'); $ r-> set_handlers (PerlResponseHandler => sub {$ self-> dispatch();}); La valeur de retour dépend du comportement souhaité. S'il n'y a pas de correspondance, retournez simplement Apache2 :: Const :: DECLINED. – myme

0

Peut-être que vous aurez du succès en utilisant une configuration mod_rewrite qui ne réécrit que les URL de votre répartiteur si un fichier demandé n'existe pas dans le système de fichiers. Ainsi, votre nouvelle application agit comme une superposition sur l'ancienne application et peut être remplacée par étapes successives en supprimant simplement les anciennes parties de l'application lors du déploiement de nouvelles pièces.

Ceci peut être accompagné d'une combinaison de RewriteCond et de RewriteRule. Votre nouvelle application doit s'asseoir dans un "espace de nommage" privé (emplacement) qui n'est pas utilisé dans l'ancienne application.

Je ne suis pas un expert en mod_perl mais avec par exemple mod_php cela pourrait fonctionner comme ceci:

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

Je pensais à la solution que vous suggérez, mais je ne peux pas savoir comment la résoudre avec des réécritures. Je pensais d'abord à ce que le Dispatcher gère toutes les requêtes, mais je pense qu'il est plus intelligent de gérer toutes les requêtes "manquantes", c'est-à-dire toutes les requêtes non trouvées par DirectoryIndex ou les gestionnaires de fichiers/mime explicites. Cela signifie qu'Apache doit appeler le répartiteur en dernier recours, au moment où il donnerait normalement un 404. Ensuite, si même le répartiteur décline, un 404 est donné. – myme

+0

J'ai ajouté un exemple de la configuration de réécriture proposée – hurikhan77