【问题标题】:Magento CSS image directives and CDN conflictMagento CSS 图像指令和 CDN 冲突
【发布时间】:2011-11-18 00:20:16
【问题描述】:

我在这里看到了一些关于当 CSS 托管在 CDN 中时 CSS 中的相对图像路径无法正常工作的问题的帖子,但我遇到了一种我无法找到答案的情况。在我们的 Magneto 商店中,我们启用了 Merge CSS 功能。不幸的是,在 Magento 中,当您这样做时,它会将它们合并到 media 文件夹中的单个文件,而不是 skin 文件夹中。所以现在,图像的相对路径不起作用。当 Magento 在非安全 URL 中找不到资源时,它会尝试安全 URL。在我们的例子中,我们不将 CDN 用于安全页面,因此它能够使用安全 URL 来查找图像。这在技术上是可行的,但我们的网站在返回图像方面比 CDN 慢,我真的很想解决这个问题。没有遍历所有 CSS sprite 并将 CDN URL 硬编码为图像路径 (undesirable) 或将 CSS 指令全部删除并将对 getSkinUrl() 的调用放在包含以下内容的模板文件中有问题的元素(不太受欢迎),我不知道如何解决这个问题。肯定有人以前遇到过这个问题。有关如何解决此问题的任何建议或想法?

谢谢!

【问题讨论】:

  • 问题是真实存在的......但我对原因的评估完全不符合标准。我已经弄清楚为什么会发生这种情况并找到了解决方案。请参阅下面的答案

标签: css cdn magento


【解决方案1】:

实际问题与 CDN 或合并的 CSS 文件相对于图像的位置无关。 Magento 实际上做了一些很酷的事情……它解析 CSS 文件并用完整的 URL 填充所有相对 URL。它在_prepareUrl 方法的Mage_Core_Model_Design_Package 类中执行此操作。它在以下行中确定是使用安全 URL 还是非安全 URL:

$secure = $store->isAdmin() ? $store->isAdminUrlSecure() : $store->isFrontUrlSecure();

这里的问题是,即使相关页面实际上并不安全,它也会使用安全的 URL。如果您启用了在前端使用安全网址,它不会一直使用安全网址。它仅在客户帐户页面和购物车/结帐时使用它们。任何其他页面都不安全,也不需要安全资源。

在合并 URL 时,Magento 很聪明,它会在 media 文件夹下创建一个 css 和一个 css_secure 文件夹。如果您查看客户帐户页面的源代码,您会注意到它正在从 css_secure 文件夹中提取 CSS,但在主页上它使用的是 css 文件夹。所以它已经设置为知道安全和非安全页面之间的区别,但是 CSS 的合并没有考虑到这一点。

为了解决这个问题,我做了一个基本的扩展,用新的_prepareUrl 方法重写了core/design_package 模型。唯一的区别是在上面提到的那一行之后我添加了这个:

$secure = $secure && Mage::app()->getRequest()->isSecure();

这可确保只有 css_secure 文件夹中的合并 css 文件才能获得资源的安全 URL。

希望这对遇到类似问题的人有所帮助。

【讨论】:

  • 为我工作。您是否将此作为错误提交给 Magento?
【解决方案2】:

您自己将您的 ​​CSS 文件合并为一个,并更改您的标头 xml 以仅提取这个 css 文件。然后,CSS 应该能够与您的图像一起存在于 CDN 上。我知道这不是一个非常奇特的解决方案,但无论如何可能值得深入到一个 CSS 文件(每个主题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2018-09-09
    相关资源
    最近更新 更多