提问者:小点点

CSS/JS/Images未从CakePHP中与主webroot不同的目录加载


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

现在我面临的问题是,当我呈现这些其他页面时,css/JS/images请求返回404 page not found状态,因为这些请求是向主webroot而不是我上面提到的不同目录发出的。

有没有办法用. htaccess来处理这个问题,也就是说,如果url包含这个模式"/admin/"

示例:

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

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

如果没有,是否有其他解决方案来处理这种情况?

以下是报告。HTC访问主应用程序目录

<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个答案

匿名用户

webroot之外的任何内容都不应是web可访问的。

主题文件不存储在webroot中,但它们旨在被复制/链接到webroot,或者通过资产调度过程提供服务。

在这种特定情况下,这意味着,例如:

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

请注意,这意味着使用正确的主题资产url,它将直接映射到一个文件(服务它时没有CakePHP或PHP逻辑)。

您还可以使用正确的url依赖资产调度(在1.3中这是自动的,在以后的版本中需要显式启用)-尽管这要慢得多。

在问题中使用了一个相对的url:

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

这是非常脆弱的,也是为什么生成的url没有指向正确的文件的一个可能因素,而是使用绝对url(在你的应用程序中,绝对url总是相对于它安装的任何地方):

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

这确保了正确的url,而不管当前控制器/动作/位置。