【问题标题】:CSS / JS / Images not loading from a different directory than main webroot in CakePHPCSS / JS /图像没有从不同于CakePHP中主webroot的目录加载
【发布时间】:2014-06-14 22:42:15
【问题描述】:

我一直在开发一个 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

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

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

以下是应用主目录的.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 版

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

【问题讨论】:

  • 请在构建 html (img) 的位置添加您的 cakephp 代码、生成的 html 和 cakephp 版本。恕我直言,你可以用 cakephp 做到这一点。
  • @Richard 我已经添加了 cakephp 代码,生成了 html 和 cake 版本,我很高兴知道这是否可以用 cakephp 完成,谢谢!
  • 您是否尝试使用此链接中的蛋糕主题book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/…

标签: .htaccess cakephp cakephp-1.3


【解决方案1】:

不是这样的

没有任何东西在 webroot 之外应该是 web 可访问的。

主题资源应该 webroot

Theme files 不存储在 webroot 中,但它们旨在被复制/链接到 webroot - 或通过资产调度过程提供服务。

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

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

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

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

在您的应用程序代码中使用“绝对”网址

在问题中使用了相对 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,而与当前的控制器/动作/位置无关。

【讨论】:

  • 我相信我在问题中犯了一个错误,网址确实是myapp.com/theme/admin/css/mycss.css,我修复了谢谢
  • 非常感谢您的回答,使用绝对网址解决了问题
  • 请接受一个答案,否则问题仍然没有回答到堆栈溢出。
猜你喜欢
  • 2020-12-01
  • 1970-01-01
  • 2014-07-23
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2013-03-17
相关资源
最近更新 更多