Silex在子目录中重写+图像

时间:2014-04-25 13:20:47

标签: apache mod-rewrite silex

我的网站托管在:

domain.com/dir1/dir2

文件系统(符号链接' d)内部映射到:

的/ var / WWW /根目录/东西/网络

在该目录中是我的应用程序的index.php,所有请求都应该路由到该目录。我在该目录中有一个.htaccess文件,其中包含以下内容:

<IfModule mod_rewrite.c>
    Options -MultiViews

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]

</IfModule>

这很好用,我的应用程序功能和所有网址都可以访问。问题是应用程序硬编码资产的所有路径。例如,当HTML呈现时,CSS被引用为: <link href="/assets/css/app.css" rel="stylesheet">实际上文件在/var/www/webroot/something/web/assets/css/app.css处于文件系统的物理位置,因此引用该文件的URL为:domain.com/dir1/dir2/assets/css/app.css

我可以用.htaccess以某种方式解决这个问题吗?

我尝试过以下方法:

<IfModule mod_rewrite.c>
    Options -MultiViews


    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/assets
    RewriteRule ^ index.php [QSA,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} ^/assets
    RewriteRule ^(.*)$ /dir/dir2$1 [L]
</IfModule>

这次尝试背后的逻辑是我可以让第一条规则处理应用程序路由。但第二条规则将确保任何请求图像的尝试都从正确的路径加载它们。不幸的是,请求转到域的webroot .htaccess无效。我也不可能在.com.com上放置.htaccess。

我有什么选择?

2 个答案:

答案 0 :(得分:0)

您应该在资源网址前加上请求基本网址。

$app['request']->getBaseUrl();

如果您使用的是Twig,可以使用:

app.request.baseUrl

顺便说一句,Silex TwigServiceProvider documentation说:

  

您必须预先添加app.request.baseUrl才能进行调用   确保在部署到docroot的子目录时渲染工作。

答案 1 :(得分:0)

尝试从原始请求行中捕获路径

RewriteCond %{THE_REQUEST} \s(/assets/\S+)\s
RewriteRule ^ /dir/dir2%1 [L]