How can I deploy Symfony in a subdirectory?

Solution 1:

Here I wrote exactly about that: https://www.refactory-project.com/install-symfony-app-in-a-subfolder-of-an-existing-site/

Upload the application part

Start by uploading the application folders at the same level of your site root:

[ftproot]
-- public_html
---- ...
---- ...
-- symfonyapp
---- app
---- bin
---- src
---- vendor
---- web
------ app.php
------ app_dev.php
------ ...
---- composer.json
---- composer.lock

Move the web part

Move the content of the "web" folder into the desired subfolder, i.e. "myapp".

[ftproot]
-- public_html
---- ...
---- ...
---- myapp
------ app.php
------ app_dev.php
------ ...
-- symfonyapp
---- app
---- bin
---- src
---- vendor
---- composer.json
---- composer.lock

Let the web know where is the application

Edit files app.php and app_dev.php and insert the new application location.

require_once __DIR__ . '/../../symfonyapp/app/bootstrap.php.cache';
require_once __DIR__ . '/../../symfonyapp/app/AppKernel.php';

Let the application know how the web folder is called

Edit file composer.json with the new web folder name

{
    ...
    "extra": {
        ...
       "symfony-web-dir": "../public_html/myapp"
    }
}

Solution 2:

You're sort of setting yourself up for hardship if you are deploying a Symfony app to a host that does not allow SSH - for instance if you want to rebuild your cache you will have to manually nuke your app/cache/* dirs?

To answer your question directly, if your Symfony project is in /www/test/ then Symfony's web directory is /www/test/web so you need to use a url like:

http://foo.com/test/web

For completeness, try accessing the explicit url - /test/app.php and /test/app_dev.php respectively. If you receive a Symfony error page in either case you know you are on the right path at least.

Edit #1

Something to point out: your project and configuration files and may be readable with this deployment scenario - which is not ideal - so you might want to check this and take some actions to secure this directory if possible. I appreciate that this is probably a test deployment so it might not be a big deal, but it's always good to keep mindful of security :)

Edit #2

Okay YMMV with this, I am no .htaccess expert but you could deploy your symfony app to /www/symfony/ and rewrite the /test URI to show /symfony/web/ instead; e.g:

RewriteEngine On
# rewrite all `/test/*` uris to `symfony/web`
RewriteRule ^test(.*)$ symfony/web/$1 [L,QSA]
# direct access to /symfony dir is a 404
RewriteRule !^symfony/web/$1 - [R=404]

This should serve all applicable uri requests (to /test and /symfony/web itself) to Symfony, while restricting direct access to the symfony core files.

Haven't tested this, so how this will play with Symfony's own .htaccess is not something I can answer off the top of my head.