【问题标题】:MIME type issue in InternetExplorer using ProxyInternetExplorer 中使用代理的 MIME 类型问题
【发布时间】:2018-06-09 04:47:31
【问题描述】:

在 Internet Explorer 中,由于 mime 类型不匹配,请求的 url 被阻止。场景是请求通过代理服务器从客户端发送到目标服务器。假设我们有 A(客户端)、B(代理服务器)、C(目标服务器)。请求从 A(客户端)到 B(代理服务器),从 B(代理服务器)到 C(目标服务器)。同样,响应也来自 C(目标服务器)到 B(代理服务器)和从 B(代理服务器)到发起请求的 A(客户端)。现在的问题是响应内容类型为“application/liquid”,但客户端使用“script src=proxyserver/test”触发请求,因此响应的例外内容类型变为“text/javascript”。不允许更改目标服务器的“应用程序/液体”响应的内容类型。整个场景在所有其他浏览器中都能完美运行,并且响应很容易访问。然而,在 IE 中,我们收到“请求因 mime 类型不匹配而被阻止”的错误。那么任何人都可以提供我们如何使其工作的解决方案吗? 以下是错误截图。

【问题讨论】:

  • 您对该请求的“接受”标头是什么?是 AJAX 请求还是常规请求?
  • 常规请求!!!通过脚本标签调用...
  • “通过脚本标签调用” - 您可以添加发出此请求的代码吗?你考虑过下面写的答案吗?
  • 是的,我已经考虑了下面的答案。我们从哪个代码添加脚本标签或我在响应中得到什么。
  • 启动请求的代码或两者兼有 - 更多信息会有所帮助。或者,如果它是可公开访问的网页,您也可以告诉我们重现该问题。

标签: javascript internet-explorer proxy mime


【解决方案1】:

您需要创建一个脚本,这是一个外部脚本,它将使用 ajax 调用或 xmlhttprequest 调用所需的代码,您需要在其中设置接受标头,以便获得所需的 mime 类型。因此,从客户端它将使用脚本标签调用该外部脚本,该脚本将通过代理服务器执行,并将进一步调用实际数据并接收其响应并发送回客户端。但由于它会调用脚本,默认情况下标头将返回为 text/javascript 并且错误将得到解决。

【讨论】:

    【解决方案2】:

    试试这个:

    response.addHeader("accept","text/javascript");

    在调用它的脚本标签的响应中设置。

    【讨论】:

      【解决方案3】:

      基本上你不能这样做。应用代理用于创建页面而不是脚本文件。

      一个可以让你到达你想去的地方的可能策略如下:

      液体部分的动态可以放入sn-p。

      <script type="text/javascrpt">
         geoShippingConfig = {
             somevalue: '{{ shop.X }}',
             etc
        };
      </script>
      

      然后在安装应用时将其注入主布局。各种应用程序都在做这种事情。您必须警告客户您将这样做,但这是相当良性的。当主题更改时,您还需要一个刷新按钮或某种方式来重新注入 sn-p 和包含。

      然后您的应用会使用您的代码安装一个脚本标签,而不是调用应用代理。脚本标签在 url 中包含 shop,因此您可以对返回的脚本文件进行任何特定于应用程序的配置。您的脚本标记脚本在加载时使用 geoShippingConfig。

      【讨论】:

      • App Proxy 还用于从不同的服务器对商店进行更改。我知道创建一个 sn-p 是可能的,但我想使用应用代理来做到这一点,这很有可能。它已经在除 IE 之外的所有其他浏览器中运行。如果你能提供IE的解决方案会更好,但请不要说这是不可能的。
      • 你不能做的是改变mime类型。如果您将代理响应的内容类型设置为 applicationéliquid,Shopify 会将其作为 textéhtml 返回到浏览器。您可以尝试的一件事是确保您请求的 url 具有 .js 扩展名。这可能会导致 Shopify 将响应视为 .js.liquid 资产文件。
      【解决方案4】:

      TL;DR - 您需要更改 mime 类型。

      当请求的预期类型与响应内容类型不同(如标头所示)时,会出现此问题。正确的解决方案是使响应和请求标头相互兼容。这意味着,您“通过脚本标记”进行的调用应更改为与响应的 content-type 标头具有相同的 accept 标头。

      另外,看看文档:

      nosniff 如果请求的类型是“style”并且 MIME 则阻止请求 type 不是 "text/css" 或 "script" 并且 MIME 类型不是 JavaScript MIME 类型。

      here

      我看到这个 URL:https://nirma.myshopify.com/apps/GeoShippingBar/geoShippingBarProxy 有这个内容类型:Content-Type:text/html; charset=utf-8,它不是 javascript-mime-type

      【讨论】:

      • 我尝试了你的解决方案,但它不起作用。是的,我知道 nosniff 要求精确的 mime 类型匹配,但这里的问题是代理代码有液体代码和 javascript 代码,所以为了得到执行的液体代码,我将内容类型设置为“应用程序/液体”,默认情况下将内容类型读取为“文本/html”。在这种情况下,我应该怎么做才能匹配 mime 类型。该错误仅发生在 IE 中,而不发生在 Chrome 或 FireFox 中。它在其他人身上正常工作。
      猜你喜欢
      • 2019-11-01
      • 1970-01-01
      • 2017-04-24
      • 2013-02-27
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      相关资源
      最近更新 更多