【问题标题】:symfony2 assets targets the /www server folder, not the /web symfony folder when deploy in productionsymfony2 资产的目标是 /www 服务器文件夹,而不是在生产中部署时的 /web symfony 文件夹
【发布时间】:2015-09-20 20:04:53
【问题描述】:

我在 Symfony 2 应用程序部署方面遇到了一些问题。我已经在我的 OVH 共享服务器上导入了我需要的所有文件,但是出现了一些错误,例如找不到 css 和 js 文件(例如内部服务器错误)或类似 Resource interpreted as Stylesheet but transferred with MIME type text/html: "http://my-server/css/458dafd_bootstrap-theme.min_1.css" 的错误。

请注意,我已经安装了CoresphereBundle,以便在我的应用程序在我的服务器上加载时在我的浏览器中有一个控制台,我只能在开发环境中访问控制台。

这是我为部署我的应用程序所做的一步一步:

1我用 composer 更新了我的应用程序和供应商(因为我无法在我的服务器上安装 composer)

composer.phar update

2我清除了开发缓存php app/console cache:clear

3我清除了产品缓存php app/console cache:clear --env=prod --no-debug

4我安装资产php app/console assets:install web

5我转储资产php app/console assetic:dump web

6我在我的服务器上上传了我的 symfony 应用程序。

7 一旦文件上传到web/app.php 我授权 产品调试

$kernel = new AppKernel('prod', true);

8然后在web/config.php我删除这个块

// …

if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
  '127.0.0.1',
  '::1',
))) {
  header('HTTP/1.0 403 Forbidden');
  exit('This script is only accessible from localhost.');
}

所以,在我的服务器上,如果我想去http://my-server/web/config.php 它工作得很好,所以我看看我的服务器是否与 symfony 兼容。唯一出现的是Set short_open_tag to off in php.ini*.

9我在我的服务器上将app/cacheapp/log文件夹的访问权限设置为777,它允许应用程序写入这些文件夹。

10 我在web/app_dev.php 中编写了这段代码,以便为我的 IP 地址允许开发模式,从而可以访问控制台包

// …

if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
  '127.0.0.1',
  '::1',
  '121.457.719.2' //a random ip adress it's just for you to understand
))) {
  header('HTTP/1.0 403 Forbidden');
  exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}

11 所以我可以访问我服务器上的开发环境,一切正常,这里没有出现错误。要访问控制台包,按照包文档,我必须写http://my-server/web/app_dev.php/_console(请参阅此处的路由代码):

_console:
    resource: "@CoreSphereConsoleBundle/Resources/config/routing.yml"
    prefix: /_console

但是这条路线不存在,如果我写了这个网址,我的浏览器中什么也没有出现:

但是,通过config.php,我可以通过Bypass configuration and go to the Welcome page 链接访问app_dev.php

我点击链接并到达app_dev.php。就像我之前说的,这个环境没有出现错误,除了控制台路由。但是我可以通过单击 symfony 调试工具栏下的控制台徽标来访问控制台:

这是我点击symfony调试工具栏下的logo时控制台的url:http://my-server/web/app_dev.php//_console/_console,我想知道为什么?

然后当我想做一些命令时,另一个错误发生了:[error] Internal Server Error 在控制台中:

如果我尝试使用路由器调试php app/console debug:router,我有这个:

php app/console debug:router | grep _console

所以,我的 symfony 应用程序存在一些问题。


更新

我解决了控制台捆绑包的问题。事实上,我的服务器没有使用我的 symfony 应用程序的相同 php 版本,我必须在我的 /www 文件夹的根目录下的 .ovhconfig 中设置它。 /www/.ovhconfig:

app.engine=php
app.engine.version=5.5
http.firewall=none
environment=production

现在,当我想访问生产环境时,我的所有资产文件都出现以下错误(css/js/images,未找到 404):

加载资源失败:服务器响应状态为 404 (Not Found) -> http://my-server.com/bundles/fosjsrouting/js/router.js

Uncaught ReferenceError: fos is not defined -> routing:1

加载资源失败:服务器响应状态为 404(未找到) ->http://my-server.com/css/45898d_dataTables.min_7.css

我不太明白,文件确实在应用程序的根目录下,例如我在http://my-server.com/ 中没有文件夹 css 或 js 等。这些文件夹位于http://my-server.com/web/。问题出在哪里?

当我访问控制台时,这是我发出的命令:

1 cache:clear

2assets:install web

3assetic:dump web


编辑:解决方案有效

我知道资产的目标是服务器根目录下的 /css /js /images etc 文件夹,因此我将 css 和 js 文件替换为 /www 服务器文件夹的根目录,例如在/www 我服务器的文件夹我有这个:

//my server
  /.ssh
  /www /*http://my-server.com/...*/
    /app/
    /bin/
    /css/
    /fonts/
    /images/
    /js/
    /src/
    /vendor/
    /web/
    /.htaccess
    /.ovhconfig
    /composer.json
    /composer.lock
    /composer.phar

为什么我的 symfony 应用程序在此处标记资产?

【问题讨论】:

  • 我想在此处添加一条注释:如果您查看此捆绑包routing.yml 文件,您会注意到它们的路由已经以_console/ routing.yml 为前缀。当您导入此文件时,您会再次添加 _console/ 前缀 - 因此您会得到输出。您可以简单地省略前缀。
  • @Artamiel 好的,我明白你的建议,所以我删除了routing_dev.yml 中的_console 路由,但是我在模态中出现错误:加载时出错调试工具栏(错误 500)。An exception has been thrown during the rendering of a template ("Unable to generate a URL for the named route "console" as such route does not exist.") in CoreSphereConsoleBundle:Toolbar:toolbar.html.twig at line 5.
  • 不,您仍然需要导入文件。试试不带prefix 部分。
  • @Artamiel 我听从了你的建议,它有效,我已经导入了没有前缀部分的路线。它有效,我有正确的路线网址。但是,当我在控制台中提交命令时,[error] Internal Server Error 消息仍然存在
  • 可能出于任何原因。您是否尝试过查看日志? app/logs 中应该有 monolog 记录的内容。

标签: php symfony deployment assets production-environment


【解决方案1】:

您是否尝试过使用 Symfony 命令行路由调试器?

php app/console debug:router

这将输出 symfony 应用程序知道的所有路由,您可以尝试将其通过管道传递到 grep 以查看您是否尝试使用错误的路径来访问 _console 路由。

php app/console debug:router | grep _console

【讨论】:

  • 感谢您回答我,在我最初的问题中查看我的编辑,我已经尝试了您的建议。
  • 我找到了解决方案,请参阅我更新的帖子。以这种方式这样做让我感到不安,我认为这不是正确的解决方案,但现在它有效。
  • 我认为与您的期望不符的是 symfony 期望 web/ 目录是公用文件夹(现在 www/ 正在播放),这就是为什么您的资产在放置时找不到的原因在网络/。我不熟悉 OVH 是如何工作的,但是你能不能把你的 symfony 应用程序放在一个更高的目录,并像现在公开 www/ 一样公开 symfony web/ 目录?
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 2014-06-13
  • 2018-01-22
相关资源
最近更新 更多