J'ai eu beaucoup de mal à faire fonctionner le moindre exemple d'application avec Zend 1.x. Zend est un framework PHP qui ne marche qu'avec de l'URL rewriting et je n'en n'avais jamais fait. Mais j'avais déjà fait des configuration Apache avec VirtualHost aussi ai-je dès le départ mis en place un virtual host. Voir mon billet précédent sur la configuration d'Apache2 avec VirtualHost.
J'ai donc une URL applicative sur ma machine qui se nomme guestbook.machine.chez.moi et à cette URL correspond le contrôleur IndexController. Un synonyme de cet URL est guestbook.machine.chez.moi/index puisqui index est le désignateur de ce contrôleur dans une URL Zend. Oui mais voilà, chez moi cette deuxième ne marchait pas et j'avais une erreur 404 générée par Apache. Idem avec guestbook.machine.chez.moi/bidon.
Je finis par découvrir qu'en fait c'était parce que le fichier .htaccess que Zend avait créé pour assurer l'URL rewriting n'était pas pris en comptes parce que dans mon fichier de configuration Apache de l'application /etc/apache2/sites-available/guestbook j'avais d'actif un Options none alors qu'il fallait y mettre un FollowSymLinks
. Mais je me suis contenté, bêtement, de recopier le bout de config donné là où j'ai trouvé cette information, à savoir Options Indexes MultiViews FollowSymLinks
sans remarquer le MultiViews
dont j'ignorais le rôle. Mais ça ne marchait toujours pas mieux…
Le log d'Apache m'informe de son refus de collaborer avec une ligne telle que :
[Wed Nov 26 15:31:52.624341 2014] [negotiation:error] [pid 10160] [client 127.0.0.1:43836] AH00687: Negotiation: discovered file(s) matching request: /home/geek/workspace/guestbook/public/index (None could be negotiated).
Mais je n'ai pas de fichier ou répertoire index, seulement un fichier index.php à la racine Apache du serveur. En gooolant le message d'erreur je trouve la cause et la solution : c'est ce foutu Multiviews
qui fait coïncider index.php avec index et cela empêche l'URL rewriting conditionnel mis en place par Zend (pas d'URL rewriting si l'URL pointe sur un fichier existant). Il faut supprimer Multiviews
et tout va pour le mieux. Voici donc ma configuration du VirtualHost avec les droits réduits au minimum :
<VirtualHost *:80>
ServerName guestbook.machine.chez.moi
DocumentRoot /home/geek/workspace/guestbook/public
DirectoryIndex index.php
<Directory />
Options none
AllowOverride None
Require all denied
</Directory>
<Directory /home/geek/workspace/guestbook/public>
Options FollowSymLinks SymLinksIfOwnerMatch
AllowOverride None
Require all granted
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
</Directory>
ErrorLog /var/log/apache2/guestbook.log
LogLevel warn
CustomLog /var/log/apache2/guestbook.log combined
</VirtualHost>
<>;VirtualHost>>
La directive AcceptPathInfo
est inutile, mais je l'ai mise pour me rappeler que c'est finalement le mécanisme induit qui est utilisé par défaut dans ce cas. Comme je n'ai pas mis FollowSymLinks
je pourrais aussi enlever RewriteCond %{REQUEST_FILENAME} -l [OR]
qui devient un test inutile.
Si on utilise un fichier .htaccess alors son contenu est celui généré par Zend :
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
et le contenu de /etc/apache2/sites-available/guestbook est :
<VirtualHost *:80>
ServerName guestbook.machine.chez.moi
DocumentRoot /home/geek/workspace/guestbook/public
DirectoryIndex index.php
<Directory />
Options none
AllowOverride None
Require all denied
</Directory>
<Directory /home/geek/workspace/guestbook/public>
Options FollowSymLinks SymLinksIfOwnerMatch
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/apache2/guestbook.log
LogLevel warn
CustomLog /var/log/apache2/guestbook.log combined
</VirtualHost>
<>;VirtualHost>>