L’idée est de ne plus accéder au backend de notre site web en utilisant backend.php dans l’url, mais de passer par un sous domaine.
- http://www.super-website.com → frontend
- http://admin.super-website.com → backend
Supposons que mon projet Symfony se trouve dans /home/public_html/.
Commençons par ajouter un vhost pour définir le sous domaine dans Apache. On précise au sous domaine que le fichier index pour ce sous domaine sera backend.php à l’aide de la directive DirectoryIndex.
ServerName admin.super-website.fr
DocumentRoot "/home/public_html/web"
DirectoryIndex backend.php
<Directory "/home/public_html/web">
AllowOverride All
Allow from All
Alias /sf /home/public_html/lib/vendor/symfony/data/web/sf
<Directory "/home/public_html/lib/vendor/symfony/data/web/sf">
AllowOverride All
Allow from All
Ensuite il faut modifier le .htaccess de Symfony afin qu’il redirige les requêtes http du sous domaine vers le fichier backend.php.
Options +FollowSymLinks +ExecCGI
RewriteEngine On
# uncomment the following line, if you are having trouble
# getting no_script_name to work
#RewriteBase /
# we skip all files with .something
#RewriteCond %{REQUEST_URI} \..+$
#RewriteCond %{REQUEST_URI} !\.html$
#RewriteRule .* - [L]
# we check if the .html version is here (caching)
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
# redirect to the backend web controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} ^admin.*
RewriteRule ^(.*)$ backend.php [QSA,L]
# no, so we redirect to our front web controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Au niveau de la config Symfony, nous pouvons maintenant masquer le nom du script dans les urls du backend:
# apps/backend/config/settings.yml
prod:
.settings:
no_script_name: true
...
Et pour finir ne pas oublier de vider le cache =), le backend est maintenant accessible sur http://admin.super-website.com.