0

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

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-actionsymfony 尝试搜索匹配的路由名称而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 中去除“应用程序名称”吗?
  4. 在每个路由 url 前加上 name-of-app/?
  5. 我应该以某种方式告诉 apache /name-of-app 是某种路径或前缀吗?请注意,在我们的生产环境中,我们无法创建虚拟主机,因此我们必须使用 .htaccess 或 symfony 本身来解决这个问题。
  6. 一个非常不同的解决方案。
4

2 回答 2

2

我不确定这是否relative_url_root是你真正想要的。正如文档所述:

relative_url_root

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

所以它是index.phpor之前的 URL 的一部分frontend_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将调用.htaccess app2.php/something

  2. 更改index.php文件。让它捕获 URL 的path-to-app/第一$configuration = ProjectConfiguration::getApplicationConfiguration('app2', 'prod', false);部分 (路由以一个:path-to-action变量开始,该变量将传递给生成 URL 的函数),或者使用 config 中定义的参数:

.

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
  ...
于 2013-02-20T14:59:57.540 回答
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.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]
于 2013-02-23T09:52:44.790 回答