让Symfony2仅使用.htaccess处理共享主机

时间:2012-02-19 19:02:02

标签: .htaccess mod-rewrite symfony shared-hosting

我一直在寻找这个4天,但找不到合适的解决方案。 我想让Symfony2在没有访问命令行或 httpd.conf 的情况下在共享主机上工作(没有办法设置虚拟主机)。我所能做的就是编辑 .htaccess 文件。在我的Web根目录中,我还有一些其他项目(比如论坛)。目录结构是:

public_html
 |-forum
 |-ox
 '-Symfony
    |-app
    |-bin
    <...>

我可以让它在dev ant prod环境中工作(路由工作正常),但它不加载任何资产(js,css,images)。错误日志中始终存在相同的内容:

request.ERROR: Symfony\Component\HttpKernel\Exception\NotFoundHttpException: No route found for "GET /bundles/acmedemo/images/welcome-demo.gif" (uncaught exception)

如果资产不是从捆绑加载,而是在 twig 中加载,则会发生同样的情况:

{{ asset('css/main.css') }}

然后以

结束
request.ERROR: Symfony\Component\HttpKernel\Exception\NotFoundHttpException: No route found for "GET /css/main.css" (uncaught exception)

public_html中的 .htaccess 是:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# DEV ENVIRONMENT #
RewriteRule ^$ Symfony/web/app_dev.php [QSA]
RewriteRule ^(.*)$ Symfony/web/app_dev.php/$1 [QSA,L]

# PROD ENVIRONMENT #
#RewriteRule ^$ Symfony/web/app.php [QSA]
#RewriteRule ^(.*)$ Symfony/web/app.php/$1 [QSA,L]

有关如何做正确的任何建议吗?

2 个答案:

答案 0 :(得分:2)

有趣的问题。在挖掘代码后,我找到了以下解决方案。

使用以下代码在PathPackage.php文件夹中创建一个名为src/Vendor/YourBundle/Templating/Asset的类。

<?php

namespace Vendor\YourBundle\Templating\Asset;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Templating\Asset\PathPackage as BasePathPackage;

class PathPackage extends BasePathPackage
{
    /**
     * Constructor.
     *
     * @param Request $request The current request
     * @param string  $version The version
     * @param string  $format  The version format
     */
    public function __construct(Request $request, $version = null, $format = null)
    {
        parent::__construct("/Symfony", $version, $format);
    }
}

然后在app/config/config.yml中添加以下参数。

parameters:
  // ...
  templating.asset.path_package.class: Vendor\YourBundle\Templating\Asset\PathPackage

现在它会将/Symfony附加到资产网址参数。

总结asset twig函数调用getUrl方法以确定网址。哪个由this类扩展。在templating.helper.assets服务创建期间,类的对象作为参数传递。幸运的是PathPackage类是configurable。所以解决方案是可能的:)。

答案 1 :(得分:1)

在本地执行php app/console assets:install ./web,并上传远程共享托管的网络文件夹内容。