【问题标题】:How can I deploy Symfony in a subdirectory?如何在子目录中部署 Symfony?
【发布时间】:2015-10-04 07:00:52
【问题描述】:

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

一些信息:

  • 主机是OVH。
  • 它不允许 SSH,我必须使用 FTP 发送我的文件。也没有命令行。
  • 我希望能够在子目录中设置网站:/www/test(我当前的网站仍在/www)。

问题:

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

我怎么知道?


编辑:

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

【问题讨论】:

  • 啊哈,刚刚看到你的编辑!

标签: symfony web-deployment subdirectory


【解决方案1】:

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

要直接回答您的问题,如果您的 Symfony 项目位于 /www/test/ 中,那么 Symfony 的 网络目录是 /www/test/web,因此您需要使用如下网址:

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/$1 [L,QSA]
# direct access to /symfony dir is a 404
RewriteRule !^symfony/web/$1 - [R=404]

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

尚未对此进行测试,所以这将如何与 Symfony 自己的 .htaccess 一起使用不是我能回答的问题。

【讨论】:

  • 我了解安全问题,我希望 URL 显示 foo.com/test,这是我的问题 :-( .
  • 当然。那么,您可公开访问的 Web 根目录是 /www 对吗?您是否有权访问此路径,或者您的主机是否允许您指定另一个 Web 根目录;例如:/www/public?我在想,如果在任何一种情况下答案都是肯定的,您也许可以将 Symfony 项目放在现有的 Web 根目录之上,然后对 Symfony Web 目录进行符号链接;例如:ln -s /www/my_symfony_project/web /www/public/test
  • 我可以访问/,公共目录是/www。您的解决方案似乎很有趣,但同样:没有命令行。我不知道在该服务器上创建符号链接的任何方法,相信我,我已经尝试过了!
【解决方案2】:

如何使用.htaccessfile 来实现您的目标。据我了解您的问题,如果您通过网络文件夹访问 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/$1 [L]
</IfModule>

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

【讨论】:

    【解决方案3】:

    我在这里写了确切的内容: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"
        }
    }
    

    【讨论】:

    • 完美运行!这正是我想要的。太感谢了。最重要的是,我必须祝贺你的文章,写得很好。
    • @Oltarus 很高兴听到这个消息!谢谢。
    • 但是路线会以这种方式工作吗?例如,@Route("/home") 应该是 example.com/subdirectory/home
    • 虽然这在理论上可以回答问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
    • @GeraldSchneider 是否可以复制/粘贴大量文章?因为我找不到比我在文章中写的更好/更短的方式来解释它。
    猜你喜欢
    • 2019-04-20
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2010-09-06
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多