CSS / JS / Images不从CakePHP中的主webroot以外的其他目录加载

时间:2014-04-29 06:29:24

标签: .htaccess cakephp cakephp-1.3

我一直在使用CakePHP应用程序,大多数CSS / JS /图像(图标)都位于webroot目录(/ var / www / app / webroot /)中,但是对于某些部分(Croogo)或其他应用程序的页面,我需要从不同的目录加载CSS / JS /图像,即/ var / www / app / views / themed / admin / webroot /.

现在我遇到的问题是,当我渲染这些其他页面时,css / JS / images请求返回404页面未找到状态,因为这些请求是针对主webroot而不是上面提到的不同目录。

有没有办法用.htaccess处理这个问题,即 如果网址包含此模式“/ admin /”

示例:

  

http://www.myapp.com/theme/admin/css/mycss.css

CSS / JS / img文件应该查到/ var / www / app / views / themed / admin / webroot /而不是var / www / app / webroot / ??

如果没有,还有其他解决方法来处理这种情况吗?

以下是主应用程序目录的.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]     
</IfModule>

以下是主webroot目录的.htaccess

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

CakePHP代码

echo $html->link($html- >image('../theme/admin/img/icons/16/icon16x16.png',array('alt'=>'','class'=>'icon left','id'=>'profile-icon')).'Resize',array('action'=>'edit_photo','01'),array('escape'=>false,'id'=>'profile-photo','class'=>'blue','rel'=>'shadowbox;height=100;width=400','title'=>'Resize'));

生成的HTML

<a href="/edit_photo/01" id="profile-photo" class="blue" rel="shadowbox;height=100;width=400" title="Resize"><img src="/theme/admin/img/icons/16/icon16x16.png?v=1000" alt="" class="icon left" id="profile-icon" />Resize</a></div>

CakePHP版本1.3

任何想法和想法都将不胜感激!

1 个答案:

答案 0 :(得分:3)

那不是它的运作方式

webroot之外的任何都不应该是Web访问的。

主题资产应在 webroot

Theme files未存储在webroot中,但它们可以复制/链接到webroot,也可以通过资产调度过程提供。

在这种特殊情况下,例如:

app
    views
       themed
           admin
               webroot
    webroot
        theme
            admin -> ../../views/themed/admin/webroot # <- a symlink

请注意,这意味着使用正确的主题资源网址 - 它会直接映射到文件(服务它时没有CakePHP或PHP逻辑)。

您还可以依靠使用正确网址的资产调度(在1.3中这是自动的,在以后的版本中需要明确启用) - 尽管这是significantly slower

使用&#34;绝对&#34;您的应用程序代码中的URL

在使用相对网址的问题中:

echo $html->image('../theme/admin/img/icons/16/icon16x16.png'
                   ^

这非常脆弱,可能是因为结果网址没有指向正确的文件 - 而是使用绝对网址(在您的应用程序中,绝对网址始终相对于安装的位置):

echo $html->image('/theme/admin/img/icons/16/icon16x16.png'
                   ^

无论当前控制器/操作/位置如何,这都可以确保正确的URL。