如何在子目录中部署 Symfony?
How can I deploy Symfony in a subdirectory?
我的网站已准备好部署,我正在尝试在线设置它。
一些信息:
- 宿主是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 应用程序部署到不允许 SSH 的主机上,您就会遇到困难 - 例如,如果您想重建缓存,则必须手动核对您的 app/cache/*
目录?
直接回答你的问题,如果你的 Symfony 项目在 /www/test/
那么 Symfony 的 web 目录是 /www/test/web
所以你需要使用 url 赞:
为了完整性,请尝试分别访问显式 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
一起玩我无法回答。
如何使用 .htaccess
file 来实现您的目标。据我了解你的问题,如果你通过 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"
}
}
我的网站已准备好部署,我正在尝试在线设置它。
一些信息:
- 宿主是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 应用程序部署到不允许 SSH 的主机上,您就会遇到困难 - 例如,如果您想重建缓存,则必须手动核对您的 app/cache/*
目录?
直接回答你的问题,如果你的 Symfony 项目在 /www/test/
那么 Symfony 的 web 目录是 /www/test/web
所以你需要使用 url 赞:
为了完整性,请尝试分别访问显式 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
一起玩我无法回答。
如何使用 .htaccess
file 来实现您的目标。据我了解你的问题,如果你通过 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"
}
}