How to install symfony2 app in a subdirectory in nginx
After hours spended to find this (sf2 doc doesn't explain how cgi parameters are needed and interpreted, you need to go through Request.php to understand), so I share this.
This is a config which seems ok with sf2 in a directory {subdir} (and web access to others files than {subdir}/web/* prohibited).
It works for me with php-fpm (socket).
Of course, replace "{subdir}" by your /path/from/docroot/to/symfony_root/
dev environnement can be choosen by adding "dev" to "{subdir}" (since app_dev.php in the url no longer works with this conf)
server { # general directives location ~ ^/{subdir}(/.*)$ { try_files /{subdir}/web$1 @sf2; } location ~ ^/{subdir}dev(/.*)$ { expires off; try_files /{subdir}/web$1 @sf2dev; } location @sf2 { expires off; fastcgi_pass {your backend}; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/{subdir}/web/app.php; fastcgi_param SCRIPT_NAME /{subdir}/app.php; fastcgi_param REQUEST_URI /{subdir}$1; } location @sf2dev { expires off; fastcgi_pass {your backend}; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/{subdir}/web/app_dev.php; fastcgi_param SCRIPT_NAME /{subdir}dev/app_dev.php; fastcgi_param REQUEST_URI /{subdir}dev$1; } # other location directives # if some others apps needs php, put your usual location to cactch php here}
I Hope it helps (and there isn't any misconfiguration), given without any guarantee...
Of course you can pick out prod/dev conf if you don't need. And you can use var and only one @sf2 location instead :
set $sf2_root /{subdir}; location ~ ^/{subdir}(/.*)$ { set $sf2_prefix /{subdir}; set $sf2_ctrl app.php; try_files $sf2_root/web$1 @sf2; } location ~ ^/{subdir}dev(/.*)$ { set $sf2_prefix /{subdir}dev; set $sf2_ctrl app_dev.php; expires off; try_files $sf2_root/web$1 @sf2; } location @sf2 { expires off; fastcgi_pass {your backend}; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$sf2_root/web/$sf2_ctrl; fastcgi_param SCRIPT_NAME $sf2_prefix/$sf2_ctrl; fastcgi_param REQUEST_URI $sf2_prefix$1; }
Here is a simpler configuration for symfony2 on the "/front/" subdirectory.Route generation and assets work fine.
The configuration
set $frontRoot /your/project/path/web;set $sfApp app_dev.php; # Change to app.php for prodlocation /front/ { # Static files root $frontRoot; rewrite ^/front/(.*)$ /$1 break; try_files $uri @sfFront;}location @sfFront { # Symfony fastcgi_pass phpfcgi; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $frontRoot/$sfApp; fastcgi_param SCRIPT_NAME /front/$sfApp; fastcgi_param REQUEST_URI /front$uri?$args; fastcgi_param HTTPS off;}
Some explanation
The trick is to make symfony believe app.php script is in /front/, so it generates routes and assets with this path.
I looked at what apache was giving to MOD-PHP to use the same values.
- SCRIPT_FILENAME: The absolute path to the PHP file. Here, it is always
/your/project/path/app_dev.php
- REQUEST_URI: The URI the user entered. Here, we have to manually re-add
/front
at the begining of the path as it was removed by the file serving location (viarewrite ^/front/(.*)$ /$1 break;
) - SCRIPT_NAME: The value is
/front/app_dev.php
. This is the most important part. Symfony will cut app_dev.php and prepend/front
to all its routes.