jeudi 27 novembre 2014

Créer un sous-DBA sous mysql pour le dév

Il s'agit de créer un utilisateur dev qui a presque tous les droits sous mysql. On trouve de tels articles tout plein dans le web, mais celui-ci est taillé sur mesure pour mes besoins !

Avant de commencer, un petit truc pour phpmyadmin : on peut entièrement le reconfigurer, y compris si la base phpmyadmin a été abimée, avec :

sudo dpkg-reconfigure phpmyadmin

Il s'agit tout simplement de créer l'utilisateur dev et ensuite de lui donner ses pouvoirs. Rien de sorcier. 4 lignes de SQL suffisent :

flush privileges;
create user 'dev'@'localhost' identified by 'password';
grant create, drop, delete, insert, select, update, alter, index on *.* to 'dev'@'localhost';
flush privileges;
Le premier flush privileges; permet de recréer l'utilisateur dev si on vient de le supprimer. Le deuxième permet de s'en servir à coup sûr.

mercredi 26 novembre 2014

URL rewriting avec Apache pour Zend 1.x

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>
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>