Hébergement d’un site CakePHP chez OVH (mutualisé)

Ce tutorial est valable pour les offres d’hébergement mutualisé suivantes :

  • 20 GP
  • 60 GP
  • 300 GP
  • 90 PLAN
  • 240 PLAN
  • 720 PLAN
  • MEDIA PLAN
  • XXL PLAN


Nous considérons que les offres inférieures au 20 GP sont trop faibles pour accueillir un site CakePHP qui espère attirer un minimum de visiteurs.

1. Arborescence distante

Lors de la première connexion sur l’espace FTP, l’arborescence à la racine de l’hébergement est la suivante :

cgi-bin/
requetes/
sessions/
www/

Le répertoire www/ est la racine du nom de domaine. Tout ce qui se trouve en dehors de www/ est inaccessible par http.

1.1 Le cœur de CakePHP

Nous téléchargeons la dernière version de CakePHP sur le site officiel (actuellement, la 1.2.0.6311-beta), la décompressons et l’uploadons à la racine de l’hébergement. On obtient l’arborescence suivante :

cake_1.2.0.6311-beta/
cgi-bin/
requetes/
sessions/
www/

Nous allons maintenant créer un “lien symbolique”, une sorte de raccourci, vers le cœur de CakePHP en nous connectant à notre hébergement par SSH. Nous suivons les instructions indiquées ici : SSH sur un serveur mutualisé OVH. Une fois parvenus sur l’invite de commande, nous tapons :

ln -s cake_1.2.0.6311-beta cakephp

Si nous rafraîchissons le FTP, l’arborescence fait maintenant apparaître :

cake_1.2.0.6311-beta/
cakephp/
cgi-bin/
requetes/
sessions/
www/

L’intérêt de créer ce lien symbolique est double :

  • En cas de mise à jour de la version de CakePHP, il n’est pas nécessaire de mettre à jour le fichier {app}/www/index.php avec le nouveau chemin, à condition que dans ce fichier nous ayons bien indiqué le chemin vers le lien symbolique et non vers le répertoire réel.
  • Si la mise à jour du cœur de CakePHP ne se passe pas bien, il suffit de recréer le lien symbolique vers l’ancienne version pour que tout refonctionne.

1.2 Les fichiers de l’application

Retournons dans le FTP et uploadons les dossiers de notre application à la racine de l’hébergement, nous devons obtenir l’arborescence suivante :

cake_1.2.0.6311-beta/
cakephp/
cgi-bin/
config/
controllers/
locale/
models/
plugins/

requetes/
sessions/
tests/
tmp/
vendors/
views/

www/
app_controller.php
app_model.php

Nous plaçons ensuite le contenu de notre répertoire webroot/ dans le répertoire www/ après en avoir supprimé le contenu d’attente mis par défaut par OVH :

cake_1.2.0.6311-beta/
[...]
views/
www/
- css/
- files/
- img/
- js/
- .htaccess
- css.php
- favicon.ico
- index.php
- test.php
app_controller.php
app_model.php

2. Configuration distante

2.1. Le fichier /config/core.php

Une seule ligne à modifier dans ce fichier, la 43 :

43
Configure::write('debug', 2);

Devient :

43
Configure::write('debug', 0);

Ainsi les messages d’erreurs et les avertissements n’apparaissent pas au visiteur, évitant ainsi de donner de précieuses informations à une personne mal intentionnée.

2.2. Le fichier /config/database.php

Après avoir créé une nouvelle base de données sur l’hébergement en nous connectant au Manager v3 d’OVH, nous récupérons les 4 paramètres de connexion (nom de l’hôte MySQL, nom de la base, login et mot de passe) pour les inscrire dans la variable $default du fichier, ligne 73 :

73
74
75
76
77
78
79
80
81
82
83
84
var $default = array(
  'driver' => 'mysql',
  'persistent' => false,
  'host' => 'nom_de_l_hote',
  'port' => '',
  'login' => 'notre_login',
  'password' => 'notre_mot_de_passe',
  'database' => 'notre_base_de_donnees',
  'schema' => '',
  'prefix' => '',
  'encoding' => ''
);

2.3. Le fichier /www/index.php

C’est dans ce fichier que nous devons renseigner CakePHP sur son répertoire de travail et le chemin vers les fichiers du cœur. Nous changeons uniquement la ligne 57 :

57
define('CAKE_CORE_INCLUDE_PATH', 'C:/Program Files/CakePHP/cake_1.2.0.6311-beta');

Devient :

57
define('CAKE_CORE_INCLUDE_PATH', '/home/[notre_login_ftp]/cakephp');

Exception sur les 20 GP : le nom du répertoire après ‘home’ n’est pas le login FTP mais un autre nom, que vous pouvez déterminer avec la fonction phpinfo().

2.4. Le fichier /www/.htaccess

Le fichier par défaut fourni par CakePHP est le suivant :

1
2
3
4
5
6
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

Nous le modifions pour obtenir :

1
2
3
4
5
6
7
SetEnv PHP_VER 5
SetEnv SESSION_USE_TRANS_SID 0
 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]

La première ligne force l’exécution des scripts PHP en version 5, la deuxième évite de faire transiter les id de sessions dans les url.

Nous supprimons la condition IfModule pour deux raisons :

  • le module d’apache mod_rewrite ne s’appelle pas comme ça chez OVH, ils ont un module fait maison qui le remplace ;
  • la réécriture d’url est activée par défaut chez OVH (attention : sauf sur les 20 GP, encore eux !).

Note : surtout bien penser au / devant index.php à la dernière ligne, sinon tous les liens seront cassés et nous n’aurons ni images ni feuilles de style.

Pierre-Emmanuel Fringant

Commentaires

Bonjour,

Dans le .htaccess on peut se servir de la règle :

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

chez OVH, ça sert souvent, je pense à SPIP par exemple.

Le coup du lien symbolique, chapeau !

L’instruction RewriteBase / doit être équivalente à l’ajout du slash devant index.php.

Sur lesCigales.ORG ca marche sans aucune modification du .htaccess ;)

J’adore ce framework et je développe actuellement le control panel de mon service d’hébergement dessus.

Pour le déploiement d’une application (CakePHP ou autre) en production, j’ai développé Fredistrano.
Je ne sais pas si c’est compatible avec OVH.
Si vous l’essayez, ce serait cool de nous laisser un feedback sur le forum.

Je vais regarder cette solution de près, c’est une excellente initiative !

Salut,

Super ce petit aide mémoire pour le mutu OVH !

Juste un ajout qui peut être utile dans le .htaccess :

SetEnv REGISTER_GLOBALS 0 car c’est pas top sécurisé d’avoir les Globales activées (par défaut elles sont à On chez OVH).

Merci pour l’info.

Je suis chez OVH (90P) et j’ai suivi ce tutoriel avec attention.
Cependant, je ne parviens à voir afficher mes images et mes feuilles de style ne sont pas pris en compte.
Une idée ?
NB : lorsque je trace les variable suivante, voilà ce que j’obtiens :
- ROOT:/home.10.26
- APP_DIR:babywadi

Les photos que j’inclu via $html->image(’baby-wadi_title.jpg’) ont comme iemplacement d’après mon navigateur : /babywadi/www/img/baby-wadi_title.jpg
En réalité, cette image se trouve dans /img/baby-wadi_title.jpg

Avez-vous bien pensé à modifier le .htaccess ? En particulier la ligne :
RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
avec le slash devant index.php.

A vrai dire, lorsque j’enlève mon .htaccess, le comportement est le même.
Les droits sur le .htaccess sont 644, comme il se doit.
Je n’ai pas d’autre .htaccess ailleurs.

J’avais désactivé l’utilisation du mod_rewrite dans le core.php.
Maintenant tout va bien.

Pierre-Emmanuel, merci pour ton précieux tutoriel.

En revanche, j’aurais eu tendance à mettre tous les fichiers du répertoire ‘app’ initial dans un repertoire indépendant, genre ‘/home/monsite/monapp/’, et non directement à la racine de mon compte chez OVH (’/home/monsite/).

C’est à dire que vous avez commenté la ligne suivante dans app/config/core.php (qui est déjà commentée par défaut) :
Configure::write('App.baseUrl', env('SCRIPT_NAME'));
Effectivement, et cela est bien précisé dans le commentaire au dessus de cette ligne, les “pretty URLs” sont incompatibles avec le mod_rewrite.
“En revanche, j’aurais eu tendance à mettre tous les fichiers du répertoire ‘app’ initial dans un repertoire indépendant”
J’ai considèré qu’il n’était pas viable d’héberger plus d’un site sur un mutualisé, mais si c’est votre objectif, vous pouvez effectivement cloisonner les applis par ce biais.

Bonjour Pierre-Emmanuel,
Je n’ai pas tout à fait le même cas de figure que décrit dans l’article.
Cake est déployé sur un sous-domaine (version de dév), mais je conserve le répertoire app sur le même niveau que celui du noyau.
Le core est bien appelé (index.php) mais impossible de trouver les images et css.
Qu’en est-il des 2 autre fichiers htaccess dont vous ne parlez pas ? (celui de app et celui de la racine)
Merci d’avance pour votre aide :)

Il y a deux .htaccess en tout :
- un à la racine de l’application qui ne sera analysé que si votre application se trouve elle-même dans le webroot de l’hébergement (ce qui n’est pas le cas dans ce tutorial) :
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>

Qui devient (chez OVH le webroot s’appelle www) :
RewriteEngine on
RewriteRule ^$ www/ [L]
RewriteRule (.*) www/$1 [L]

- le deuxième .htaccess se trouve dans le webroot, c’est celui-ci que nous décrivons à la fin de l’article.

Il y a 3 htaccess en tout par défaut dans cake (?) :
- celui de la racine
- celui de la racine de app
- celui de la racine de webroot

Voici mon arbo sur le serveur (sous-domaine) :

cake

app/
.htaccess
—- webroot/
—- .htaccess

.htaccess

===================
htacces de la racine :
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
=================
htaccess de app :
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
===================
htaccess de webroot :
SetEnv PHP_VER 5
SetEnv SESSION_USE_TRANS_SID 0
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]

Le soucis, c’est lorque que j’appele une url du type :
http://www.mosite.com/page
il reroute vers http://www.monsite.com/home/loginftp/page

Ca m’a l’air correct. Je regarderai plutôt du côté du fichier webroot/index.php pour voir si les constantes ROOT et APP_DIR sont correctes pour votre configuration.

Mon erreur était dans le htaccess de la racine.
Il ne faut pas oublier le slash.
Merci de ta réactivité Pierre-Emmanuel :)

htacces de la racine :
RewriteEngine on
RewriteRule ^$ /app/webroot/ [L]
RewriteRule (.*) /app/webroot/$1 [L]

Participez