2009-06-22 3 views
0

Je rencontre un problème avec les directives mod_vhost_alias d'Apache et mod_rewrite pour le routage de "jolies URL" avec un machine de développement local. Je sais que c'est possible, car mon fournisseur d'hébergement utilise une configuration similaire et n'a aucun problème. Toutefois, chaque fois que j'essaie sur ma machine locale, Apache renvoie une erreur 500 Internal Server, et les journaux indiquent trop de redirections internes.500 Erreur de serveur: boucle de réécriture infinie dans Apache 2.2.x avec mod_vhost_alias, VirtualDocumentRoot et mod_rewrite pour le routage/"jolies" URL

Normalement Terminé

Je suis généralement un procédé classique simple, lors de l'ajout de domaines à ma machine locale pour le développement:

  • Créer un répertoire /path/to/www/ nommé selon le domaine, à savoir: /path/to/www/example.local/
  • Ajouter une entrée dans /etc/hosts pour le nouveau domaine, par exemple: 127.0.0.1 example.local
  • Ajouter une directive VirtualHost pour le nouveau domaine avec le DocumentRoot ensemble à /path/to/www/example.local/pub/
  • Redémarrez Apache

Le problème

J'ai récemment commencé à utiliser la directive VirtualDocumentRoot fournie par mod_vhost_alias pour nettoyer ma liste sans cesse croissante de VirtualHost directives et me sauver les tracas de redémarrer Apache après chaque nouveau domaine:

CanonicalName Off 
VirtualDocumentRoot /path/to/www/%0/pub/ 

Dans l'un des domaines, par exemple example.local, je pourrais avoir les éléments suivants:

RewriteEngine On 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-l 
RewriteRule .* index.php/%0 [L] 

C'est une typique « jolie URL »/modèle de routage pour la plupart des applications et des cadres modernes. Cependant, Apache entre dans une boucle de redirection infinie lorsque je tente de charger example.local/anything/that/should/work dans mon navigateur.

Je permis au RewriteLog de déterminer ce qui se passait, et a constaté que Apache exécutait les éléments suivants:

  • supprimer le préfixe de répertoire (/path/to/www/example.local/pub/) à partir de l'URL
  • Process le RewriteRules normalement, comme prévu , générant /index.php/anything/that/should/work
  • Prepend à nouveau le préfixe du répertoire, ce qui donne: /path/to/www/example.local/pub/index.php/anything/that/should/work
  • RECOMMENCER. (!!)

La question

Quelqu'un at-il vu d'autre ce comportement et formulé une solution pour cela? Sinon, quelqu'un peut-il voir une erreur flagrante dans ma configuration Apache que je pourrais manquer?

Répondre

0

Avez-vous essayé d'ajouter le drapeau NS à votre RewriteRule:

RewriteRule .* index.php/%0 [L,NS] 
+0

Je ne l'ai pas. Cependant, comme je l'ai mentionné ci-dessus, mon fournisseur d'hébergement utilise cette méthode pour fournir des domaines dans un environnement partagé, et aucun indicateur supplémentaire n'est nécessaire. Merci pour cette suggestion, et je vais essayer. –

4

Essayez d'utiliser RewriteBase, j'ai eu le même problème et cela a fonctionné pour moi. Bonne chance.

+0

J'ai également essayé d'ajouter "RewriteBase /" à certains de mes blocs RewriteRule avec un succès mitigé. Ce _kinda_ a fonctionné mais pas toujours. –