嵌套目录中的Symfony 2项目

时间:2013-09-10 09:50:53

标签: php symfony

我需要在生产服务器上的嵌套目录中部署Symfony 2项目。实际上,这意味着所有URL都以/ subdirectory / path为前缀,即

http://host.com/subdirectory/project/web/app.php/survey

我不需要重写URL,也不打算进行设置。只有通过上述网址访问时,该应用才有效。

我遇到的问题是pathasset Twig函数生成的所有链接都与服务器根目录( / )相关,而不是项目所在的子目录( /子目录/ )。 Symfony 2中是否有任何配置参数覆盖全局的相对路径?

我尝试通过添加HTML标记解决该问题,但它不适用于链接。

更新:我欠你的更多细节。我正在使用其mod_rewrite版本运行IIS,因此您的部分建议可能仍然有效。

更新:理想情况下,我希望看到一个在AppKernel对象上设置root目录的解决方案 - 方法AppKernel::setRootDir()已存在以补充现有的AppKernel::getRootDir()

5 个答案:

答案 0 :(得分:3)

奇怪...使用默认配置,路径/资产应该处理子目录。你是否已经开始使用symfony发行版进行了尝试?在localhost上,我主要以这种方式使用它。 你介意发布你的配置文件吗?

总之... 对于您可以尝试配置的资产路径:

#config.yml
templating:
  assets_base_urls: { http: "http://yoursite.com/dir1", ssl: "https://yoursite.com/dir1" }

http://symfony.com/doc/current/reference/configuration/framework.html#assets-base-urls

对于路由器,您应该阅读:http://symfony.com/doc/current/cookbook/console/sending_emails.html#configuring-the-request-context-globally 它可以为您提供有关更改路由器上下文的一些想法,如:

# app/config/parameters.yml
parameters:
  router.request_context.host: example.org
  router.request_context.scheme: http
  router.request_context.base_url: my/path

无论如何 - 根据请求信息自动设置上下文。尝试调试:

$context = $this->getContainer()->get('router')->getContext();
// you should be mainly interested in:
$context->getBaseUrl();

可以轻松创建监听器类,无论如何它都会手动设置你的基本URL:

class RouterContextListener {

    protected $router;

    public function __construct(RouterInterface $router)
    {
        $this->router = $router;
    }

    public function onKernelRequest(Event $event)
    {
        $this->router->setBaseUrl('somedir');
    }
}

答案 1 :(得分:2)

您正在寻找RewriteBase规则,请将其添加到您的.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /subdirectory/project/web
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L] 
</IfModule>

另请查看symfony-standard 2.3 .htaccess文件,mb可以提供帮助

<IfModule mod_rewrite.c>
    RewriteEngine On

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

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

    # If the requested filename exists, simply serve it.
    # We only want to let Apache serve files and not directories.
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]

    # Rewrite all other queries to the front controller.
    RewriteRule .? %{ENV:BASE}/app.php [L]
</IfModule>

答案 2 :(得分:0)

查看app / config / routing.yml,从捆绑包中导入路由。该文件中的记录看起来与此类似:

somename:
    resource: "@YourBundle/Resources/config/routing.yml"
    prefix:   /

您可以在前缀中添加子目录,例如prefix: /subdirectory 然后,所有生成的网址都将包含subdirectory

答案 3 :(得分:0)

要启用重写模块,请运行“apache2 enable module rewrite”:

sudo a2enmod rewrite

您需要重新启动网络服务器才能应用更改:

sudo service apache2 restart

VirtualHost应该是这样的          ServerName localhost.myproject.dev     ServerAdmin webmaster @ localhost

DocumentRoot /var/www/project_path
<Directory /var/www/project_path>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ /app.php [QSA,L]
    </IfModule>
</Directory>

此选项重定向index.php,index.html或其他:

Options Indexes FollowSymLinks MultiViews

它会重写你的htacces!

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ /app.php [QSA,L]
    </IfModule>

答案 4 :(得分:0)

我在本地环境中的解决方案是在app/config/config.yml

中添加以下代码
framework:
    assets:
        base_urls:
            - 'http://localhost/symfony_dir/'

不需要重写!