How can I deploy Symfony in a subdirectory?

2019-01-15 04:57发布

问题:

My website is ready to be deployed and I am trying to set it up online.

Some informations:

  • The host is OVH.
  • It doesn't allow SSH, I have to send my files with FTP. No command line either.
  • I want to be able to set up the website in a subdirectory: /www/test for now (my current website is still in /www).

The problem:

When I open the URL my-website.com/test, a Symfony exception tells me No route found for "GET /test/", which clearly means that Symfony doesn't know it is in a sub-directory.

How can I tell it?


EDIT:

I just realized it worked when I access my-website.com/test/web.

回答1:

Here I wrote exactly about that: https://www.refactory-project.com/2015/11/30/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"
    }
}


回答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.



回答3:

How about using .htaccessfile to achieve your goal. As far as I understand your problem your symfony app works IF you access it via web folder for example foo.com/test/web

try using the following code in your .htaccess file which will sit at the root of your test directory

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.domain.com$
RewriteCond %{REQUEST_URI} !web/
RewriteRule (.*) /web/$1 [L]
</IfModule>

please replace the domain.com with your domain name.