使用代理时InternetExplorer的MIME类型问题

10
在Internet Explorer中,由于mime类型不匹配,所请求的URL被阻止。场景是请求通过代理服务器从客户端发送到目标服务器。假设我们有A(客户端),B(代理服务器),C(目标服务器)。请求从A(客户端)到B(代理服务器),从B(代理服务器)到C(目标服务器)。同样地,响应也从C(目标服务器)到B(代理服务器),从B(代理服务器)到发起请求的A(客户端)。现在问题是,响应的Content-type为“application/liquid”,但客户端使用“script src = proxyserver/test”发送请求,因此期望的响应Content-Type变为“text/javascript”。不允许更改来自目标服务器的响应的Content-type为“application/liquid”。整个场景在所有其他浏览器中均正常工作,并且可以轻松访问响应。但是,在IE中,我们会收到“由于mime类型不匹配而被阻止的请求”的错误。那么,有人能提供解决方案,如何使其正常工作吗? 以下是错误的截图。

enter image description here


你的请求中的“Accept”头是什么?它是一个AJAX请求还是一个常规请求? - Mindaugas Bernatavičius
常规请求!通过脚本标签调用... - Radhesh Vayeda
“通过脚本标签调用” - 你能添加发出此请求的代码吗?你考虑过下面写的答案吗? - Mindaugas Bernatavičius
是的,我已经考虑了下面的答案。我们从哪里添加脚本标签或者我在响应中得到了什么代码。 - Darshit Patel
发起请求的代码或者更多信息都会有所帮助。如果问题是一个公开可访问的网页,您也可以告诉我们如何重现该问题。 - Mindaugas Bernatavičius
显示剩余3条评论
4个回答

3

简而言之 - 您需要更改MIME类型。

当请求的类型与响应内容的类型不同时(由头部指示),就会出现此问题。正确的解决方案是使响应和请求头彼此兼容。这意味着您通过脚本标签进行的调用应更改为与响应的content-type头相同的accept头。

此外,请查看文档:

nosniff如果请求类型为“样式”,则阻止请求,但MIME类型不是“text / css”,或者为“脚本”,但MIME类型不是JavaScript MIME类型。

请参见此处

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


我尝试了你的解决方案,但它没有起作用。是的,我知道nosniff要求精确的MIME类型匹配,但问题在于代理代码中有Liquid代码和JavaScript代码,因此为了执行Liquid代码,我将内容类型设置为"application/liquid",默认情况下将读取内容类型为"text/html"。在这种情况下,我应该怎么做才能匹配MIME类型?错误只发生在IE中,而不是Chrome或FireFox中。在其他浏览器中它正常工作。 - Darshit Patel

2
尝试这样做:
在调用脚本的标签的响应中设置response.addHeader("accept","text/javascript")。

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

0

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

一个可能的策略是按照以下步骤进行:

从液态部分中提取动态内容并将其放入片段中。

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

当您的应用程序安装时,将其注入到主布局中。各种应用程序都会这样做。您必须警告客户您要这样做,但它相当温和。您还需要一个刷新按钮或某种方式来重新注入片段和包含当主题更改时。

然后,您的应用程序使用脚本标记安装带有您的代码的标记,而不是调用应用程序代理。脚本标记在URL中包括商店,因此您可以对返回的脚本文件进行任何特定于应用程序的配置。您的脚本标记脚本在加载时使用geoShippingConfig。


App代理也是用于从不同的服务器更改商店的内容。我知道可以通过创建代码片段来实现,但我想使用应用程序代理来完成,这是完全可行的。它已经在除IE之外的所有其他浏览器中运行。如果您能为IE提供解决方案,那将更好,但请不要说这是不可能的。 - Darshit Patel
你不能更改MIME类型。如果你将代理响应的内容类型设置为applicationéliquid,那么Shopify会将其作为textéhtml返回给浏览器。你可以尝试的一件事是确保你请求的URL具有.js扩展名。这可能会导致Shopify将响应视为.js.liquid资产文件。 - bknights

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接