6

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

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

我不需要 URL 重写,也不会设置它。仅通过上述 URL 访问时,该应用程序应该可以工作。

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

我试图通过添加 HTML 标签来解决这个问题,但它不适用于链接。

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

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

4

5 回答 5

3

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

无论如何...对于资产路径,您可以尝试配置:

#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');
    }
}
于 2013-09-24T20:17:56.843 回答
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文件,它可以提供帮助

<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>
于 2013-09-18T16:03:23.757 回答
0

Look at app/config/routing.yml where you import routing from your bundles. Records in that file would look similar to this:

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

You can add your subdirectory in prefix, like prefix: /subdirectory Then all generated URLs will include subdirectory.

于 2013-09-10T16:06:54.740 回答
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>
于 2013-09-19T07:58:31.780 回答
0

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

framework:
    assets:
        base_urls:
            - 'http://localhost/symfony_dir/'

无需重写!

于 2016-05-11T16:09:02.737 回答