使用代理的 InternetExplorer 中的 MIME 类型问题
MIME type issue in InternetExplorer using Proxy
在 Internet Explorer 中,请求的 url 由于 MIME 类型不匹配而被阻止。场景是请求通过代理服务器从客户端发送到目标服务器。假设我们有 A(Client)、B(Proxy Server)、C(Destination Server)。请求从 A(客户端)到 B(代理服务器),从 B(代理服务器)到 C(目标服务器)。同样,响应也来自 C(目标服务器)到 B(代理服务器)和从 B(代理服务器)到发起请求的 A(客户端)。现在的问题是响应内容类型为 "application/liquid" 但客户端使用 "script src=proxyserver/test" 触发请求,因此响应的例外内容类型变为 "text/javascript"。不允许更改来自目标服务器 "application/liquid" 的响应的内容类型。整个场景在所有其他浏览器中都能完美运行,并且可以轻松访问响应。但是在 IE 中,我们得到的错误是 "request blocked due to mime type mismatch " 。那么任何人都可以提供我们如何使其工作的解决方案吗?
下面是错误的截图。
TL;DR - 您需要更改 MIME 类型。
当请求的预期类型不同于 response-content 类型(如 header 所示)时,会出现此问题。正确的解决方案是使响应和请求 header 相互兼容。这意味着,您“通过脚本标记”进行的调用应更改为具有与响应的 content-type
[=] 相同的 accept
header 35=].
另外,看看文档:
nosniff Blocks a request if the requested type is "style" and the MIME
type is not "text/css", or "script" and the MIME type is not a
JavaScript MIME type.
见here。
我看到这个 URL: https://nirma.myshopify.com/apps/GeoShippingBar/geoShippingBarProxy 有这个 content-type: Content-Type:text/html; charset=utf-8
而不是 javascript-mime-type.
基本上你不能这样做。 App Proxy 用于创建页面而不是脚本文件。
将您带到您想去的地方的可能策略如下:
液体部件的动态可以放入片段中。
<script type="text/javascrpt">
geoShippingConfig = {
somevalue: '{{ shop.X }}',
etc
};
</script>
然后在安装应用程序时将其注入到主布局中。各种应用程序都在做这种事情。您必须警告客户您将要这样做,但这是相当温和的。您还需要一个刷新按钮或某种方式来在主题更改时重新注入代码段和包含。
然后您的应用会使用您的代码安装脚本标签,而不是调用应用代理。脚本标签包括 url 中的商店,因此您可以对返回的脚本文件进行任何特定于应用程序的配置。您的脚本标记脚本在加载时使用 geoShippingConfig。
试试这个:
response.addHeader("accept","text/javascript");
在调用脚本标记的响应中设置。
您需要创建一个脚本,一个外部脚本,它将使用 ajax 调用或 xmlhttprequest 调用所需的代码,您需要在其中设置接受 header 以便所需的 MIME 类型。因此,从客户端,它将使用脚本标记调用该外部脚本,该脚本标记将通过代理服务器执行,并进一步调用实际数据并接收其响应并发送回客户端。但是因为它会调用脚本,默认情况下 header 会 return 为 text/javascript 并且错误将得到解决。
在 Internet Explorer 中,请求的 url 由于 MIME 类型不匹配而被阻止。场景是请求通过代理服务器从客户端发送到目标服务器。假设我们有 A(Client)、B(Proxy Server)、C(Destination Server)。请求从 A(客户端)到 B(代理服务器),从 B(代理服务器)到 C(目标服务器)。同样,响应也来自 C(目标服务器)到 B(代理服务器)和从 B(代理服务器)到发起请求的 A(客户端)。现在的问题是响应内容类型为 "application/liquid" 但客户端使用 "script src=proxyserver/test" 触发请求,因此响应的例外内容类型变为 "text/javascript"。不允许更改来自目标服务器 "application/liquid" 的响应的内容类型。整个场景在所有其他浏览器中都能完美运行,并且可以轻松访问响应。但是在 IE 中,我们得到的错误是 "request blocked due to mime type mismatch " 。那么任何人都可以提供我们如何使其工作的解决方案吗? 下面是错误的截图。
TL;DR - 您需要更改 MIME 类型。
当请求的预期类型不同于 response-content 类型(如 header 所示)时,会出现此问题。正确的解决方案是使响应和请求 header 相互兼容。这意味着,您“通过脚本标记”进行的调用应更改为具有与响应的 content-type
[=] 相同的 accept
header 35=].
另外,看看文档:
nosniff Blocks a request if the requested type is "style" and the MIME type is not "text/css", or "script" and the MIME type is not a JavaScript MIME type.
见here。
我看到这个 URL: https://nirma.myshopify.com/apps/GeoShippingBar/geoShippingBarProxy 有这个 content-type: Content-Type:text/html; charset=utf-8
而不是 javascript-mime-type.
基本上你不能这样做。 App Proxy 用于创建页面而不是脚本文件。
将您带到您想去的地方的可能策略如下:
液体部件的动态可以放入片段中。
<script type="text/javascrpt">
geoShippingConfig = {
somevalue: '{{ shop.X }}',
etc
};
</script>
然后在安装应用程序时将其注入到主布局中。各种应用程序都在做这种事情。您必须警告客户您将要这样做,但这是相当温和的。您还需要一个刷新按钮或某种方式来在主题更改时重新注入代码段和包含。
然后您的应用会使用您的代码安装脚本标签,而不是调用应用代理。脚本标签包括 url 中的商店,因此您可以对返回的脚本文件进行任何特定于应用程序的配置。您的脚本标记脚本在加载时使用 geoShippingConfig。
试试这个:
response.addHeader("accept","text/javascript");
在调用脚本标记的响应中设置。
您需要创建一个脚本,一个外部脚本,它将使用 ajax 调用或 xmlhttprequest 调用所需的代码,您需要在其中设置接受 header 以便所需的 MIME 类型。因此,从客户端,它将使用脚本标记调用该外部脚本,该脚本标记将通过代理服务器执行,并进一步调用实际数据并接收其响应并发送回客户端。但是因为它会调用脚本,默认情况下 header 会 return 为 text/javascript 并且错误将得到解决。