Aprende a configurar un virtualhost para un proyecto basado en Symfony 4.


Poco despues de iniciar con el desarrollo con Symfony 4 localmente en un entorno XAMPP, termine con un par de problemas de routing causados básicamente por mi configuración predeterminada de mi virtual host para el proyecto. El error que me permitio percatarme de que el error no estaba en Symfony como tal si no en la configuración local de mi entorno para apache, fue el hecho de que la barra de debug no cargaba correctamente y siempre encontraba el mensaje de "Symfony 4 : An error occurred while loading the web debug toolbar". Noté tambien que no habia una excepción como tal sino un mensaje que decía "No se ha encontrado en este servidor". Luego de leer rápidamente la documentación de symfony respecto al tema, hubieron muchos cambios que incluyen el archivo .htaccess (que por defecto no existe a no ser que instales un módulo especial de apache en tu proyecto).

La primera opción para solucionar este problema es el crear este archivo .htaccess instalando un módulo en tu proyecto y configurando el virtual host para este caso. La segunda opción es el desactivar completamente el uso de .htaccess en tu virtual host y en caso de que necesites añadir directivas, agregarlas directamente en este en vez del archivo .htaccess. En este articulo te mostraremos como implementar ambas opciones en xampp.

A. Con archivo .htaccess

Si deseas usar un archivo .htaccess para sobreescribir directivas de apache en tu proyecto, procede a instalar el paquete de symfony/apache-pack en tu proyecto de Symfony 4 con el siguiente comando:

composer require symfony/apache-pack

Luego de su instalación, se creará automaticamente el archivo .htaccess dentro del directorio project/public de tu proyecto con un contenido similar a:

# Use the front controller as index file. It serves as a fallback solution when
# every other rewrite/redirect fails (e.g. in an aliased environment without
# mod_rewrite). Additionally, this reduces the matching process for the
# start page (path "/") because otherwise Apache will apply the rewriting rules
# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
DirectoryIndex index.php

# By default, Apache does not evaluate symbolic links if you did not enable this
# feature in your server configuration. Uncomment the following line if you
# install assets as symlinks or if you experience problems related to symlinks
# when compiling LESS/Sass/CoffeScript assets.
# Options FollowSymlinks

# Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve
# to the front controller "/index.php" but be rewritten to "/index.php/index".
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Determine the RewriteBase automatically and set it as environment variable.
    # If you are using Apache aliases to do mass virtual hosting or installed the
    # project in a subdirectory, the base path will be prepended to allow proper
    # resolution of the index.php file and to redirect to the correct URI. It will
    # work in environments without path prefix as well, providing a safe, one-size
    # fits all solution. But as you do not need it in this case, you can comment
    # the following 2 lines to eliminate the overhead.
    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]

    # Sets the HTTP_AUTHORIZATION header removed by Apache
    RewriteCond %{HTTP:Authorization} .
    RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect to URI without front controller to prevent duplicate content
    # (with and without `/index.php`). Only do this redirect on the initial
    # rewrite by Apache and not on subsequent cycles. Otherwise we would get an
    # endless redirect loop (request -> rewrite to front controller ->
    # redirect -> request -> ...).
    # So in case you get a "too many redirects" error or you always get redirected
    # to the start page because your Apache does not expose the REDIRECT_STATUS
    # environment variable, you have 2 choices:
    # - disable this feature by commenting the following 2 lines or
    # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
    #   following RewriteCond (best solution)
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]

    # If the requested filename exists, simply serve it.
    # We only want to let Apache serve files and not directories.
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ - [L]

    # Rewrite all other queries to the front controller.
    RewriteRule ^ %{ENV:BASE}/index.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        # When mod_rewrite is not available, we instruct a temporary redirect of
        # the start page to the front controller explicitly so that the website
        # and the generated links can still be used.
        RedirectMatch 307 ^/$ /index.php/
        # RedirectTemp cannot be used instead
    </IfModule>
</IfModule>

Este archivo .htaccess reescribirá directivas solamente si el virtual host lo permite, así que como ultimo paso debes crear un virtual host con la siguiente estructura. Procede a editar el archivo de vhost de xampp (xampp\apache\conf\extra\httpd-vhosts.conf) y registra tu vhost con la siguiente estructura:

<VirtualHost 127.0.0.1:80>
    DocumentRoot "C:/xampp72/htdocs/php/sandbox/public"
    DirectoryIndex index.php

    <Directory "C:/xampp72/htdocs/php/sandbox/public">
        AllowOverride All
        Order Allow,Deny
        Allow from All
    </Directory>
</VirtualHost>

Guarda los cambios de tu archivo de virtual host y reinicia apache con el control y ya está !

B. Sin .htaccess

Como se menciona en la documentación oficial, si escoger no usar un archivo .htaccess en tu proyecto, incrementarás ligeramente el rendimiento de tu servidor web. Sin embargo, toda la configuración relacionada a apache debe ser hecha desde el archivo de virtual host y la configuración por defecto cambiará:

<VirtualHost 127.0.0.1:80>
    DocumentRoot "C:/xampp72/htdocs/php/sandbox/public"
    DirectoryIndex index.php

    <Directory "C:/xampp72/htdocs/php/sandbox/public">
        AllowOverride None
        Order Allow,Deny
        Allow from All

        FallbackResource /index.php
    </Directory>
</VirtualHost>

Usando la directiva AllowOverride con valor None provocará que ningun archivo .htaccess pueda sobreescribir directivas y tu proyecto comenzará a funcionar inmediatamente despues de guardar los cambios en el archivo de vhosts xampp\apache\conf\extra\httpd-vhosts.conf y reiniciar el servicio de apache.

Que te diviertas !


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores