Faire tourner Symfony2 sous IIS7

Grâce à Composer, l’installation de Symfony2 est une partie de plaisir… sur les serveurs Apache, qui supportent bien le .htaccess !

Au boulot, nous n’utilisons pas Apache, mais Windows Server et son fameux IIS (Internet Installation Services) dans sa version IIS7.0. Or, l’installation de Symfony2 sur un serveur Windows est légèrement plus touchy, bien que cela reste parfaitement raisonnable !

Installation de PHP

Je ne reviendrai pas ici en détails sur l’installation de PHP sur IIS7, parfaitement détaillée sur le site de PHP. Pour la version de PHP, préférez le NTS (Non Thread Safe) ; par exemple pour PHP5 j’ai choisi la VC11 NTS Win32. Ce tutoriel vous fera également passer par toute une étape d’ajout de rôles à votre serveur ; ainsi que la mise en place d’un mappage de module sur IIS avec le module FastCGI. Bien évidemment, assurez-vous que ce module soit actif sur le site que vous créerez pour Symfony.

Configuration de IIS

Toutes les root mènent à Symfony

Passons alors à la configuration de IIS. Une fois les sources de votre sites installées dans un quelconque répertoire de votre serveur (pour ma part j’utilise toujours le dossier C:\inetpub\wwwroot\monsitest) assurez-vous que le site IIS pointe bien sur le dossier web/ de votre site, et non pas à sa racine d’où partent les dossier app/ etc…

Documents par défaut

Globalement, IIS déclarera toute une panoplie de documents à charger par défaut sur un nouveau site ; mais jamais ceux qui nous intéressent. Rendez-vous donc dans Gestionnaire de services Internet au niveau de votre site, et rendez-vous dans la partie « Document par défaut ». De là, ajoutez le document « app.php » (dans le cas d’un site standard, ajoutez index.php).

iis_doc_defautURL Rewriting

Le problème aurait du vous interpeler dès que j’ai dis que IIS ne gérait pas le fichier .htaccess. En effet, le système de routes de Symfony2 utilise la réécriture d’URL ; il va donc falloir remplacer ce fichier htaccess par des règles IIS. Seul souci : IIS ne gère pas nativement la réécriture d’URL. Autrement dit, il faut passer par le web pour installer un petit module supplémentaire. Très facile à installer, ce module se télécharge directement sur le site internet de Microsoft (attention sur ce lien c’est le module pour les serveurs 64 bits). Une fois le module installé, vous avez une petite icône « Réécriture d’URL » qui apparait sur votre gestionnaire IIS.

iis_url_rewriteLe transfert des règles de réécriture étant un peu complexe à détailler (et un peu chiant aussi), je vous propose une solution alternative : insérer directement celles-ci dans le fichier web.config situé à la racine de votre site (la racine IIS, j’entends, c’est-à-dire le dossier web/ de votre arborescence Symfony2. Normalement ce fichier existe déjà, étant donné que vous avez personnalisé vos documents par défaut pour ce site ; sinon, créez-le et remplissez-le de la manière suivante.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <defaultDocument>
            <!-- ici se trouvent vos documents par défaut (dont app.php) -->
        </defaultDocument>
        <rewrite>
		  <rules>
                <clear />
                <rule name="Symfony 1" stopProcessing="true">
                    <match url="^app\.php(/(.*)|$)" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                    <action type="Redirect" url="/{R:2}" redirectType="Permanent" />
                </rule>
                <rule name="Symfony 2" stopProcessing="true">
                    <match url=".?" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" />
                    </conditions>
                    <action type="None" />
                </rule>
                <rule name="Symfony 3" enabled="true" stopProcessing="true">
                    <match url=".?" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                    <action type="Rewrite" url="/app.php" />
                </rule>
		  </rules>
		</rewrite>
        <staticContent>
            <!-- ici se trouvent vos types MIME personnels -->
        </staticContent>
        <handlers>
            <!-- ici se trouvent vos mappages de gestionnaires / modules -->
        </handlers>
    </system.webServer>
</configuration>

Vous notez la présence des balises <clear/> qui servent à dire à IIS : « oublie les paramètres par défaut applicables à tous les sites, et prend ceux-ci« . Si vous supprimez ces lignes, alors IIS plantera en disant qu’un même paramètre ne peut être défini deux fois.

Les droits d’accès

IIS possède deux utilisateurs distincts sur le serveur : IUSR et IIS_IUSRS. Globalement, retenez que IUSR est l’utilisateur anonyme de IIS, et IIS_IUSRS représente les utilisateurs authentifié via un des module d’authentification du gestionnaire (authent digest, windows, etc…). Dans notre cas, on peut ouvrir les accès aux deux.

Ce que vous allez faire c’est donc :

  • Donner à l’intégralité de l’arborescence Symfony un accès en lecture/exécution aux utilisateurs IUSR et IIS_IUSRS.
  • Donner un accès en écriture, pour ces mêmes utilisateurs, aux dossiers app/cache et app/logs de manière a éviter les magnifiques erreurs du genre : RuntimeException: Failed to write cache file

Voilà, en théorie avec ces paramétrages, votre site Symfony devrait être fonctionnel. Sinon  n’hésitez pas à faire remonter ici vos erreurs, que nous voyons ensemble d’où cela peut provenir.

Laisser un commentaire

Votre courriel ne sera pas publiée. Les champs Nom et Courriel sont obligatoires.

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>