Symfony没有检测到相对的url root

时间:2013-02-20 14:42:31

标签: apache2 symfony-1.4

在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. 我应该在htaccess中以某种方式使用RewriteBase吗?
  3. 我应该使用htaccess在REQUEST_URI中删除'app-of-app'吗?
  4. 使用name-of-app /?
  5. 为每个路由网址添加前缀
  6. 我应该告诉apache / app-of-app是某种路径还是前缀?请注意,在我们的生产环境中,我们无法创建虚拟主机,因此我们必须使用.htaccess或symfony本身来解决此问题。
  7. 一个非常不同的解决方案。

2 个答案:

答案 0 :(得分:2)

我不确定relative_url_root是否是您真正追求的。正如the documentation所述:

  

relative_url_root

     

relative_url_root选项定义前端控制器之前的URL部分。大多数情况下,框架会自动检测到这一点,而不需要更改。

因此它是index.phpfrontend_dev.php之前的网址的一部分

在我看来,你可以做的是编写自己的路由类,它将扩展sfPatternRouting并在尝试匹配任何路由之前删除URL的前缀部分。然后使用此类在factories.yml中进行路由。

编辑:我错过了你在不同的应用程序之间运行的事实。

一般情况下,relative_url_root绝对不是将调用分开到不同应用的好主意。在我看来,最好的方法是使用单独的前端控制器和虚拟主机来拥有不同的子域。不幸的是,你说你不能选择这个选项。

然后你可以选择其中一个解决方案:

  1. 摆弄.htaccess并让您将来电重定向到正确的前端控制器:myurl.com/path-to-app1/something将呼叫app1.php/somethingmyurl.com/path-to-app2/something将呼叫app2.php/something

  2. 更改index.php文件。让它抓住网址的第一部分(path-to-app/)并根据其值加载适当应用的配置(例如$configuration = ProjectConfiguration::getApplicationConfiguration('app2', 'prod', false);) 然后,您必须更改路由以考虑URL的第一部分(例如,所有路由都以:path-to-action变量开头,该变量将传递给生成URL的函数),或者使用定义的参数在配置中:

  3. 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
      ...
    

答案 1 :(得分:1)

修复路由:

我改变了我的.htaccess如下。

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

通过使用这个重写规则,symfony似乎认识到/ name-of-app是路由中的前缀,并以某种方式在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.ext之类的请求重定向到https://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]