【问题标题】:header("Content-type: text/css"); is working in Firefox and Chrome, but in Internet Explorer 9 it shows up as 'text/html'header("内容类型:文本/css");在 Firefox 和 Chrome 中运行,但在 Internet Explorer 9 中显示为“text/html”
【发布时间】:2011-07-21 18:00:54
【问题描述】:

header("Content-type: text/css"); 适用于 Firefox、Chrome 和其他,但不适用于 Internet Explorer 9。我不确定发生了什么。

在 Chrome 和 Firework 中,如果我在自己的选项卡中打开样式表并将其应用于页面,它会显示样式表。

在开发者工具的网络下的 Chrome 中,它显示类型为text/css,状态为 200。

在 Internet Explorer 9 中,如果我在自己的选项卡中打开样式表并且它没有被应用到页面,它想要下载样式表。

在 F12 开发者工具中,您可以点击网络,开始捕获并刷新页面。它显示Style.css.php。类型为text/html,结果为406。

这是在头脑中:

<link rel="stylesheet" type="text/css" href="/assets/css/style.css.php" media="screen" />

请求标头:

Key Value
Request GET /assets/css/main.css HTTP/1.1
Accept  text/css
Referer http://10.0.1.5/
Accept-Language en-US
User-Agent  Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding gzip, deflate
Host    10.0.1.5
Connection  Keep-Alive
Cookie  PHPSESSID=*Hidden*

响应标头:

Key Value
Response    HTTP/1.1 406 Not Acceptable
Date    Fri, 01 Apr 2011 10:12:42 GMT
Server  Apache/2.2.14 (Ubuntu)
Alternates  {"main.css.php" 1 {type application/x-httpd-php}}
Vary    negotiate
TCN list
Keep-Alive  timeout=15, max=100
Connection  Keep-Alive
Content-Type    text/html; charset=iso-8859-1

【问题讨论】:

  • “不起作用”是什么意思?有什么问题?
  • 它没有正确加载它,就像在 IE 中根本没有加载 css 文件。如果我去文件,它想下载它而不是像 Chrome 和 Firefox 那样显示它。
  • 您是否尝试不发送标头? :)
  • 是的。 css 文件是一个 php 文件,因为我会检查您想要的工具栏颜色的帐户设置。
  • 你试过[Ctrl]+[F5](强制重载)吗?

标签: php http-headers content-type internet-explorer-9


【解决方案1】:

IE 有“No, I'm not kidding about Content-Type”开关:

X-Content-Type-Options: nosniff

顺便说一句:确保在 PHP 中还发送 Last-Modified 并禁用 session.cache_limiter,否则浏览器会不断重新加载 CSS 文件,这将对性能产生负面影响。

【讨论】:

  • header("Content-Type: text/css"); header("X-Content-Type-Options: nosniff");header("Content-Type: text/css;X-Content-Type-Options: nosniff;"); 不起作用。我应用对了吗?
  • 还将 session.cache_limiter 设置为 nocache。所以我只是输入关闭?
  • @Keverw:不要将两个标题放在一个 header() 调用中。 session.cache_limiter 必须是 none(但这是性能问题,不应阻止 MIME 类型工作)。使用 Fiddler2 或类似的工具来查看您的服务器实际发送了哪些标头。
  • 我为您添加了 IE 在问题中看到的标题。
  • 这就是答案吗?此线程上似乎没有任何内容表明“答案”
【解决方案2】:

Internet Explorer 有信任文件扩展名而不是浏览器报告的 MIME 类型的历史。如果您有可用的 mod_rewrite,请让您的 HTML 查找 .css 文件,然后创建一个 mod_rewrite 规则,将该 URL 传送到您的脚本。

【讨论】:

  • +1;然而,不仅仅是 IE 倾向于盲目地信任文件扩展名(这应该是完全没有意义的!)而不是 MIME 类型。他们都在different context
【解决方案3】:

我发现使用header("Content-type: text/css", true); 对我有用。它会阻止服务器为“Content-Type”输出 2 个 HTTP 标头。

【讨论】:

  • header()的第二个参数默认为true
  • @Marcel 但出于某种原因,它对我有用。 PHP 7.2.7-0ubuntu0.18.04.2 (cli)
【解决方案4】:

在发送标头之前是否有任何输出? php文件中的BOM?回车?

如果您禁用错误报告,您可能看不到它应该触发的错误。

尝试在顶部添加ob_start(),它将解决与在任何header() 调用之前已发送的标头相关的任何问题。

如果您的 UTF8 文件中有 BOM,您可能需要将其删除。

【讨论】:

    【解决方案5】:

    我认为问题可能是由于 mod_security 提供 401 错误页面 (HTML) 而不是 CSS。尝试将此添加到您网站的 Web 根目录中的 .htaccess 文件中,看看这是否可以解决问题。

    <IfModule mod_security.c>
        SecFilterEngine Off
        SecFilterScanPOST Off
    </IfModule>
    

    【讨论】:

      【解决方案6】:

      文章 Handle Images/CSS/JS as PHP without httpd.conf Using .htaccess 帮助我解决了问题。

      你基本上和其他人提到的一样做所有的事情(在 PHP 中设置标题等),但也使用.htaccess 来设置 AddHandler 参数。

      <Files my_style.css>
          ForceType application/x-httpd-php
          AddHandler application/x-httpd-php .css
      </Files>
      

      这样你就可以用 .css 命名它,并且仍然让 PHP 解析它。

      【讨论】:

      • 我还做了一些服务器端检查,看看它是否是 ie9,然后将其重定向到特定文件,只是抱歉。
      • 还应该注意的是,当使用 ForceType 时,IE 使用设置的任何内容并忽略您在 PHP 页面中放置的任何内容。这就是您收到 406 错误的原因。这就是为什么我必须将文件命名为 .css 以便 IE 满意。
      【解决方案7】:

      对于在动态生成的 CSS 文件的响应标头中提供 HTTP 406 状态代码的 Internet Explorer 9,我们:

      1. 删除了 Apache mod_negiotiation 模块或将 -Multiviews 添加到主机配置(或 .htaccess)中。
      2. 已激活 Apache mod_rewrite
      3. 在虚拟主机配置或 htaccess 中添加了重写规则:

        <IfModule mod_rewrite.c
        
          RewriteEngine on
          RewriteBase /
        
          #serve CSS and JS from combine.php
          RewriteRule ^combine(.*) combine.php [NC,L]
        
        </IfModule>
        

      注意:此解决方案仅适用于不使用 Multiviews 的服务器/虚拟主机,因为删除 mod_negotiation 也会删除此指令的使用。

      【讨论】:

        【解决方案8】:

        最近我自己也遇到了这样的问题。我只能说讨厌的调试。不知道这是否可以帮助你们,但我希望它会。切入正题。

        Internet Explorer 使用一种称为 Mime 类型嗅探的东西,它只读取 200 字节的 THE FILE 标头。

        我有一个 PHP 脚本,它必须根据提供的参数返回不同的视频文件(带有数据 - 整个文件)。

        我的视频请求示例:get-video.php?id=here_goes_the_id

        $file = ''; // Get the video file path
        if (is_file($file)) {
            header("Content-Type: video/mp4");
            header("Content-Length: " . filesize($file));
            readfile($file);
        }
        exit(); // This is the turnaround
        

        您必须在发送文件数据后立即暂停您的脚本。 这可以防止 IE Mime 类型的嗅探。

        希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 2015-05-13
          • 1970-01-01
          • 2012-05-08
          • 1970-01-01
          • 2013-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多