如何在子目录中部署 Symfony?

How can I deploy Symfony in a subdirectory?

我的网站已准备好部署,我正在尝试在线设置它。

一些信息:

问题:

当我打开 URL my-website.com/test 时,一个 Symfony 异常告诉我 No route found for "GET /test/",这显然意味着 Symfony 不知道它在子目录中。

我怎么知道?


编辑:

我只是在访问 my-website.com/test/web 时才意识到它有效。

如果您将 Symfony 应用程序部署到不允许 SSH 的主机上,您就会遇到困难 - 例如,如果您想重建缓存,则必须手动核对您的 app/cache/*目录?

直接回答你的问题,如果你的 Symfony 项目在 /www/test/ 那么 Symfony 的 web 目录是 /www/test/web 所以你需要使用 url 赞:

http://foo.com/test/web

为了完整性,请尝试分别访问显式 url - /test/app.php/test/app_dev.php。如果您在任何一种情况下都收到 Symfony 错误页面,那么您至少知道自己在正确的道路上。

编辑 #1

需要指出的一点:您的项目和配置文件可能在这个部署场景下是可读的——这并不理想——所以您可能想要检查一下,并在可能的情况下采取一些措施来保护这个目录。我很欣赏这可能是一个测试部署,所以它可能不是什么大问题,但注意安全总是好的 :)

编辑 #2

好的 YMMV,我不是 .htaccess 专家,但您可以将您的 symfony 应用程序部署到 /www/symfony/ 并重写 /test URI 以显示 /symfony/web/;例如:

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

这应该为 Symfony 提供所有适用的 uri 请求(对 /test/symfony/web 本身),同时限制对 symfony 核心文件的直接访问。

还没有测试过,所以这将如何与 Symfony 自己的 .htaccess 一起玩我无法回答。

如何使用 .htaccessfile 来实现您的目标。据我了解你的问题,如果你通过 web 文件夹访问它,你的 symfony 应用程序可以工作,例如 foo.com/test/web

尝试在 .htaccess 文件中使用以下代码,该文件将位于 test 目录的根目录下

<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/ [L]
</IfModule>

请将 domain.com 替换为您的域名。

我在这里写的正是:https://www.refactory-project.com/install-symfony-app-in-a-subfolder-of-an-existing-site/

上传申请部分

首先将应用程序文件夹上传到站点根目录的同一级别:

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

移动 Web 部件

将“web”文件夹的内容移至所需的子文件夹,即“myapp”。

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

让网络知道应用程序在哪里

编辑文件 app.php 和 app_dev.php 并插入新的应用程序位置。

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

让应用程序知道 web 文件夹的调用方式

使用新的网络文件夹名称编辑文件 composer.json

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