CSS3 PIE - 在没有尾部反斜杠的情况下访问站点时,不会加载行为HTC文件

时间:2012-10-25 19:39:42

标签: css3 internet-explorer-8 internet-explorer-7 css3pie

当我以两种不同的方式访问使用CSS3 PIE的站点时,在一种情况下找不到HTC文件。我正在使用示例域名和路径名来说明下面的问题。可能导致这种情况发生的原因是什么?

  

http://sampledomain.com/site< - 不会渲染圆角   IE8

     

http://sampledomain.com/site/< - 渲染圆角

位于

的CSS圆角文件
  

http://sampledomain.com/site/content/css/pie.htc

该网站包含来自

的CSS文件
  

http://cdn.cdndomain.com/path/to/content/css/rounded-corners.css

CSS:

.rounded-corners
{
    behavior: url(content/css/pie.htc);
}

4 个答案:

答案 0 :(得分:5)

尽管你在这个问题的其他地方发表了评论,但这实际上并不是IE中的错误;它完全理性地处理相对路径。

发生此问题的原因是因为就URL路径而言,两个URL(即带有和不带斜杠)实际上位于不同的目录中。

  • http://sampledomain.com/site - 这被视为site是根目录中的文件名。

  • http://sampledomain.com/site/ - 这被视为根目录中的site是一个目录,并且您正在该目录中加载默认文件。

就浏览器而言,这两个URL位于不同的目录路径中。因此,如果指定相对路径,则它将相对于每个路径中的不同路径,其中一个路径显然不会指向正确的位置。如果你有其他具有相对路径的项目,例如图像,它们也会有相同的问题,并且它将在所有浏览器中,而不仅仅是IE。 (因此,我假设您在此页面上没有很多其他相对路径)

正如您已经解决的那样,快速解决方案是将其转换为绝对路径,从斜杠开始。这将确保从站点中的相同位置加载它,无论您从哪个URL加载它。

然而,这个问题暗示了一个更大的问题。行为良好的站点不应允许这两个URL有效。没有斜杠的URL应该使用斜杠重定向到URL;不管是否有斜杠,都不应该简单地加载相同的内容。

允许两个网址加载相同的内容明显不利于您网站的搜索引擎优化。这意味着Google会将您的网站视为具有相同内容的两个网页,而这又会被视为您谷歌排名的减号。

使用.htaccess / mod_rewrite可以轻松解决此问题,理想情况下,您可以像原始CSS3Pie加载问题一样紧急解决此问题。

希望有所帮助。

答案 1 :(得分:2)

由于behavior是Internet Explorer的非标准CSS属性,因此它的实现也是非标准的(因为没有规范)。似乎唯一的选择是确保声明中URL的值是绝对路径 - 而不是相对路径。

这解决了这个问题:

.rounded-corners
{
    behavior: url(/site/content/css/pie.htc);
}

答案 2 :(得分:1)

根据W3C,网址是相对于样式表的 - 即。在你的情况下,cdn。我不确定它为什么会起作用!

然而,由于部分工作,我还有另一个答案。 / site url被浏览器解释为网站中的一个页面 - 浏览器无法告诉它它是一个没有/的文件夹。这意味着相对路径将相对于网站的根文件夹。解决这个问题的最简单方法是将网址更改为/site/content/css/pie.htc

答案 3 :(得分:0)

standard CSS properties中,相对URL与CSS文档相关:

  

URI可以用单引号或双引号引用。允许相对URI,并且相对于样式表的URL(而不是网页的URL)。

但是,behavior是一个专有的IE属性,而URL是相对于引用工作表的HTML文件,所以更容易确保它工作的方法是使用绝对路径。 / p>

如果你仍然想要使用相对路径,你可以使用URL重写,或者在所有可能的路径中复制.htc文件,或者在服务器端进行其他一些黑客操作,这样它就可以服务于来自任何路径的.htc文件(例如,在MVC中,您可以添加处理.htc文件的所有请求的路由,并使用从适当位置为其提供服务的控制器)。由于所有这些解决方案都有点hacky,我更喜欢绝对路径,除非应用程序可以同时存在于根目录或任何虚拟文件夹中。