【问题标题】:how to move symfony /web/app.php to /root/app.php如何将 symfony /web/app.php 移动到 /root/app.php
【发布时间】:2015-01-17 17:48:49
【问题描述】:

在我的 symfony 中,我将 /MySymfonyFolder/web/app.php 移至根目录并将其重命名为 index.php,例如/MySymfonyFolder/index.php,我将 htaccess 更改如下,但是当我写 here 时,它会导致通过 cssrewrite 查找 css 图像出现问题。

1) 我也不想将 /MySymfonyFolder/web/bundles/、/MySymfonyFolder/web/images/ 和 /MySymfonyFolder/web/css 移动到 /MySymfonyFolder/。 2) 我不想将 /app/ 和 /src/ 移到 symfony 根目录之外的上层。

假设我想要一个子文件夹中的所有 /index.php (symfony app.php)、/app/ 和 /src/,htaccess 应该如何识别 /MySymfonyFolder/index.php 和 /MySymfonyFolder/web / 它也可以找到图像?

这是我的错误 .htaccess 导致 css 图像问题。请更正。我搜索了 stackoverflow 并没有发现任何关于此的内容。

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]

    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]

    RewriteRule .? %{ENV:BASE}/index.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        RedirectMatch 302 ^/$ /index.php/
    </IfModule>
</IfModule>

【问题讨论】:

  • 您正在移动应用程序的入口点和基础 url,因此您可能会弄乱任何相对路径,例如 /bundles/mybundles/css/main.css 现在可能需要 /web/bundles/mybundles/css/main.css 引用。我目前没有方便的 Symfony 来仔细检查它,但看起来你更改了文档根目录,这会破坏相关链接
  • 是否可以在 /MySymfonyFolder/ 根目录中使用 htaccess 解决所有问题?
  • 您可以将对 /bundles/ 的任何请求重写为 /web/bundles。 symfony 团队以这种方式构建框架是有原因的,如果文档根目录是更高级别的,那么您就会产生安全风险。如果您能解释为什么要这样做,那么我们应该能够提出更好的解决方案
  • 你能推荐一个更好的htaccess吗?

标签: apache .htaccess symfony


【解决方案1】:

你应该看看documentation

如果你需要重命名或移动你的 web 目录,你唯一需要保证的是 app 目录的路径在你的 app.php 和 app_dev.php 前端控制器中仍然是正确的。如果您只是重命名目录,就可以了。但是如果你以某种方式移动它,你可能需要修改这些文件中的路径:

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

您还需要更改 composer.json 文件中的 extra.symfony-web-dir 选项:

{
    ...
    "extra": {
        ...
        "symfony-web-dir": "."
    }
}

【讨论】:

  • 实际上我做到了,它正在工作,但它有资产问题,正如我在这里所说的 stackoverflow.com/questions/27993233/… 我应该怎么做?
  • 请阅读上面的评论。我认为我在那个问题中描述的问题是因为资产配置中的 read_from 在这里symfony.com/doc/current/cookbook/configuration/… 正确吗?
  • 这个简单的答案不仅帮助我解决了我的问题,还提醒我,一个初学者,所有的框架结构都可以而且应该改变以适应个人需求。谢谢!
【解决方案2】:

试试:

RewriteEngine on
RewriteBase /
RewriteRule ^css/(.*) web/css/$1
RewriteRule ^images/(.*) web/images/$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]

RewriteEngine on
RewriteBase /
RewriteRule ^bundles/(.*) web/bundles/$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]

所有这些都在寻找通常在 web 文件夹中的任何请求,并将 web/ 部分预先挂在请求中,所以理论上它应该可以工作,可能只需要根据你拥有的文件进行调整.

您还应该考虑更新 .htaccess 以防止直接访问不在 web 文件夹中的其他应用程序文件,Symfony 使这些文件无法访问是有原因的。不推荐使用根文件夹作为 DocumentRoot。

【讨论】:

  • 我重新设置了这个答案,因为关于这样做涉及的安全风险的观点是有效的,关于使用 .htaccess 来防止访问其他文件夹的观点也是有效的。顺便说一句,重写规则并没有搞砸。答案中列出的重写规则的唯一原因是纠正 OP 在他的问题中使用的规则。
  • @Paziツ 我认为这是他的观点,他建议保持“symfony 方式”,即通过 web 文件夹路由应用程序
  • 在 stof github.com/symfony/AsseticBundle/issues/340 的帮助下,我能够将 app.php 放在根文件夹中,并将 images/、css/ 和 bundles/ 文件夹保存在 web/ 文件夹中。现在一切正常,除了 css 背景图像。知道如何解决这个问题吗?
  • 您可能需要将url(/bundles/..) 更新为/web/bundles,因为这就是更新后的路径(我认为)。就我个人而言,我从未尝试移动 app.php 文件夹,因为我知道这会导致诸如此类的各种问题
  • 此结构仅在您将项目安装在主站点文件夹时才有用,这样其他文件夹将不公开且安全,但如果您想将项目安装在像 example.com/symfony 这样的文件夹中,其他文件夹是仍然是公开的,应该用 htaccess 保护这就是为什么我说这个结构是无用的。看到这个stackoverflow.com/questions/28032757/…你有什么想法吗?
【解决方案3】:

我的经验法则是,如果您使用 Symfony2,无论如何它对于共享主机来说可能太大了。您需要控制您的服务器,尤其是设置文档根目录等。

考虑使用诸如 Linode 或 Digital Ocean 之类的东西。或者重新考虑是否需要像 Symfony2 这样的全栈框架。我相信 Laravel 在共享主机上运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 2013-06-15
    • 2016-05-08
    • 1970-01-01
    • 2014-06-06
    • 2017-10-02
    • 2017-01-10
    • 2017-02-17
    相关资源
    最近更新 更多