Symfony的不检测相对URL根(Symfony does not detect relative

2019-11-01 14:31发布

在settings.yml中的symfony 1.4,我们正在使用的选项:

env:
  request:
    param: 
      relative_url_root: /name-of-app

指定哪些relative_url_root的应用程序使用。 所以每一个应用程序在不同的relative_url_root运行。

问题是,symfony的1.4路由不检测这个相对URL根。 因此,例如,如果我们有以下途径:

route_name:
  url:  /some-module/some-action
  param: { module: somemodule, action: someaction }

我们试图访问http://myproject.local/name-of-app/some-module/some-action symfony中试图寻找途径名称相匹配name-of-app/some-module/some-action ,而不是中/some-module/some-action

另外的symfony现在尝试连接到使用此relative_url_root图像,因此图像不再被发现。 因为图像只能通过到达http://project.local/img/..而不是http://project.local/name-of-app/img

什么是解决这个的最好方法?

  1. 我应该删除“/”的地方?
  2. 我应该使用RewriteBase莫名其妙htaccess的?
  3. 我应该使用htaccess的在REQUEST_URI脱光“名称的应用程序内”?
  4. 前缀名称的应用程序内/每个路由网址是什么?
  5. 我应该以某种方式告诉Apache是​​/ - 的 - 应用程序名称是某种路径或前缀? 请注意,在我们的生产环境中,我们不能够创建虚拟主机,所以我们必须解决这个使用的.htaccess或symfony的本身。
  6. 一个非常不同的解决方案。

Answer 1:

我不知道如果relative_url_root真的是你以后在做什么。 由于该文件规定:

relative_url_root

所述relative_url_root选项定义URL的前端控制器之前的部分。 在大多数情况下,这是自动由框架检测,并不需要改变。

因此,它是之前的URL的一部分index.phpfrontend_dev.php等。

你可以做什么,在我看来,是写自己的路由类将延长sfPatternRouting并将它试图匹配任何路线之前删除网址的前缀部分。 然后使用这个类在路由factories.yml

编辑:我种种原因错过了你不同的应用程序之间进行活动的事实。

一般来说, relative_url_root绝对不是分离到不同的应用程序调用一个好主意。 最好的办法,在我看来,是使用单独的前端控制器和虚拟主机有不同的子域。 不幸的是,你说你不能去这个选项。

然后,您可以去任何的解决方案:

  1. 捣鼓的.htaccess并做301重定向你调用一个适当的前端控制器: myurl.com/path-to-app1/something会调用app1.php/somethingmyurl.com/path-to-app2/something将调用app2.php/something

  2. 更改index.php文件。 有它赶上URL的第一部分( path-to-app/ ),并在此基础上的价值加载正确的应用程序的配置(例如$configuration = ProjectConfiguration::getApplicationConfiguration('app2', 'prod', false); )然后,您将不得不改变你的路线,考虑到有URL的第一部分(例如,把所有的路线开始了:path-to-action变量将被传递给函数生成的URL),或使用参数在配置定义:

In apps/app1/config/app.yml
path_to_app: app1

In apps/app1/config/routing.yml
route1:
  url: <?php echo sfConfig::get('app_path_to_app') ?>/something
  ...


Answer 2:

修正了路由:

我改变了我的.htaccess如下。

RewriteCond %{HTTP_HOST} myproject.local
RewriteCond %{THE_REQUEST} /name-of-app* [NC]
RewriteRule ^(.*)$ dispatcher.php/$1 [QSA,L]

通过使用这种重写规则的symfony似乎意识到/名称-应用程序-在路由前缀并以某种方式与之匹配的relative_url_root 。 现在,当我的var_dump的sfRoute对象在控制器中,我得到以下。

object(sfRoute)[33]
  protected 'isBound' => boolean true
  protected 'context' => 
    array (size=7)
      'path_info' => string 'some-module/some-action' (length=10)
      'prefix' => string '/name-of-appp' (length=8)
      'method' => string 'GET' (length=3)
      'format' => null
      'host' => string 'myproject.local' (length=20)
      'is_secure' => boolean true
      'request_uri' => string 'https://myproject.local/name-of-app/some-module/some-action' (length=47)

请注意,我并没有改变路由规则的Michal建议。 此外,我相信我有办法relative_url_root是不是真的像Symfony的理解它是奇怪的。

修正了直接文件访问:

为了重定向等的请求https://myproject.local/name-of-app/some/path/to/a/file.exthttps://myproject.local/some/path/to/a/file.ext我用下面的指令。

RewriteCond %{REQUEST_URI} \..+$
RewriteCond %{REQUEST_URI} !\.html$
RewriteCond %{REQUEST_URI} ^/name-of-app
RewriteRule ^name-of-app/(.*)$ https://myproject.local/$1 [L]


文章来源: Symfony does not detect relative url root