【问题标题】:Symfony3 routing not working with web root configurationSymfony3 路由不适用于 Web 根配置
【发布时间】:2017-08-26 17:56:12
【问题描述】:

我正在尝试将一些新的 Symfony3 应用程序集成到现有的网络空间中。在我的 webroot /html 中,每个应用程序都有自己的目录。这些应用程序中的每一个都可以是任何东西——cakePHP、自定义 PHP 等等。每个都可以通过 localhost/appname 之类的 URL 访问。这种结构不灵活,我不能再向虚拟主机或类似的东西添加 URL 模式。

因此,我将 Symfony3 安装在 /symfony,它是 /html 的同级目录。在 /html 中,我有一个 Symfony 应用程序的登录目录:/html/symfonyapp。

在 /html/symfonyapp/index.php 我只有一行代码: require_once <strong>DIR</strong>.'/../../symfony/web/app.php';

在我的 Symfony 设置中,我有一个名为 SymfonyappBundle 的包。我在 src/SymfonyappBundle/Resources/config/routing.yml 中配置了一条路由,以将对 /symfonyapp 的调用重定向到这个特定的 Bundle。

路由不工作。对http://localhost/symfonyapp 的调用总是会转到“/”的路由,为什么?我觉得这与我的 Symfony 设置无关,而是与通过 /html/Symfonyapp/index.php 文件传入的请求有关。

非常感谢任何帮助!

编辑:我认为列出目录结构很有帮助,所以这里是: - /var/www/html <-- this is your (global) web root |- cake-app |- custom-php-app |-symfonyapp |—index.php (which contains only a require for app.php) -/var/www/symfony <—symphony standard install here |- app/ |- vendor/ |- src/ |- web/ <-- the web root for your symfony-app |- .htaccess |- app.php <-- the "boot"-script similar to index.php

【问题讨论】:

    标签: php symfony symfony-routing


    【解决方案1】:

    我希望我做对了。您的目录结构如下所示:

    - /var/www/html   <-- this is your (global) web root 
    |- cake-app
    |- custom-php-app
    |- symfony    <-- the project root for you symfony-app
     |- app/
     |- vendor/
     |- src/
     |- web/          <-- the web root for your symfony-app
      |- .htaccess
      |- app.php      <-- the "boot"-script similar to index.php
    

    所以基本上你有一个典型的 Symfony 应用程序,但它位于一个共享的 Web 根目录中。所以当你访问它时,你不要去http://example.com/,而是去http://example.com/symfony/web/

    这可能是您遇到的第一个问题。您的应用程序必须从 web 文件夹访问,而不是从 symfony 文件夹访问。例如,根据 /var/www/html/.htaccess 中的一些重写规则,您可能无法查看 symfony-subfolder 中的文件,并且没有入口脚本,因此它不起作用。根据您的设置,您甚至可能没有权限重写每个 .htaccess 或服务器配置中的 url,这会使事情变得更加复杂。现在让我们假设 web/ 中的 .htaccess 文件确实有效,这只是您的 url 指向的文件夹错误。

    如果您希望通过http://example.com/symfony/(不带web/-部分)访问该URL,您有多种选择。 Symfony 的项目结构实际上非常灵活,您可以摆脱 symfony/web/-文件夹,而使用 symfony/ 作为您的 web 根目录。可能会有一些陷阱,例如一些安装脚本将 css 和 js 等资源复制到您的 web 根目录中。当捆绑包指向 web 目录时,您也可能会遇到问题,例如用于存储上传。您可能需要进行一些调整,但通过将所有文件从 Web 移动到父文件夹(包括可能隐藏的 .htaccess),应该可以立即完成基本设置。

    另一种选择可能是在 symfony 的项目根目录中创建一个新的 .htaccess,它指向 web/app.php 而不仅仅是 app.php。您可以将现有文件作为参考。我尽量避免使用 htaccess-files 并且现在没有设置我可以尝试它,但在移动大量文件之前可能值得一试。尽管您仍然可能会遇到路径不正确匹配的资产问题。

    编辑:另一个可能更有效的选项,但如果你想从其他现有的网络应用程序迁移到一个 Symfony 应用程序,可能会很有用,将 symfony 移动到与 html/ 相同的级别并移动所有东西从 web/ 到 html/。现在你的服务器的 web 根目录也是 symfony 的 web 根目录(同样你可能不得不摆弄期望在一个名为 web/ 的文件夹中的资产)。现在你只需要确保当 Symfony 没有找到路由时,它会将请求传递给你的其他应用程序。有几件事需要注意,它比上面的 2 种方法要多得多,但它可能很有用。去年柏林的 SymfonyCon 上有一个很好的讨论,如果你对这条路线感兴趣,该怎么做:

    很遗憾,演讲的视频还没有出来。

    【讨论】:

    • 对这个痛苦的评论过程感到抱歉。我已将 dir 结构添加到原始帖子中。问题不在于我找不到 symfony 目录。但是我只能访问默认路由,不能访问任何自定义路由。一切都只是通过 symfony 中的默认路由。
    • 在这种情况下尝试将内容从 web 移动到 symfonyapp。您可能需要在 app.php 中调整一些路径,例如自动装载机的位置。在路径的开头添加另一个 ../ 可能就足够了。
    • 如果 htaccess 不起作用并且您的 app.php 未使用而不是索引。尝试将其内容复制到 index.php(并且为了安全起见,将 .htaccess 更新为指向 index.php)。
    【解决方案2】:

    我找到的解决方案是为每个 Web 应用程序添加一个自定义内核。因此,对于我的 webroot /var/www/html 下的每个文件夹,我在 Symfony 中添加了一个新内核。每个内核都有自己的路由和配置文件,这解决了我的路由问题!我按照这个 symfony 文档设置内核:http://symfony.com/doc/current/configuration/multiple_kernels.html

    App1:

    • webroot: /var/www/html/app1/index.php 有典型的 app.php 代码,它初始化 App1 内核:$kernel = new App1Kernel('dev', true);
    • symfony 详细信息:在app/config 中,我为每个内核添加了一个目录,所以这将是app/config/app1。我将所有配置、路由、服务文件复制到此目录中,并引用了应用程序的自定义 Bundle。

    App2:

    • webroot: /var/www/html/app2/index.php 有典型的 app.php 代码,它初始化 App1 内核:$kernel = new App2Kernel('dev', true);
    • symfony 详细信息:在app/config 中,我为每个内核添加了一个目录,所以这将是app/config/app2。我将所有配置、路由、服务文件复制到此目录中,并引用应用程序的自定义 Bundle,并将对 Bundles 的所有引用更改为适当的 bundle。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      相关资源
      最近更新 更多