禁用 Chrome 严格的 MIME 类型检查
Posted
技术标签:
【中文标题】禁用 Chrome 严格的 MIME 类型检查【英文标题】:Disable Chrome strict MIME type checking 【发布时间】:2017-01-06 19:22:39 【问题描述】:有什么方法可以在 Chrome 中禁用 strict MIME type checking
。
实际上我正在跨域发出 JSONP 请求。它在 Firefox 上运行良好,但是在使用 chrome 时,它在控制台中出现了一些错误。
拒绝执行来自 'https://example.com' 的脚本,因为它的 MIME 类型 ('text/plain') 不可执行,并且启用了严格的 MIME 类型检查。
它在 Mozilla 中完美运行.. 问题仅在 chrome 中出现
这是请求的响应标头..
Cache-Control:no-cache, no-store
Connection:Keep-Alive
Content-Length:29303
Content-Type:text/plain;charset=ISO-8859-1
Date: xxxx
Expires:-1
Keep-Alive:timeout=5
max-age:Thu, 01 Jan 1970 00:00:00 GMT
pragma:no-cache
Set-Cookie:xxxx
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
解决我的想法:
外部设置 content-type 为application/javascript
【问题讨论】:
你见过类似的问题吗? ***.com/questions/17341122/… @Rory McCrossan 是的......这个问题是指从 github 获取文件......它们是将文件导出为 zip 的替代解决方法...... 您以纯文本形式发送的内容是什么? 它收到一个json..响应是这样的..angular.callbacks._3(json_data)
我错过了你正在发送 JSONP;您需要使用正确的 MIME 类型:application/javascript
【参考方案1】:
在 node.js
的获取处理程序中将路由名称更改为单个路由
我的app.get('/all-produce/search',(req,res))
不工作
但我将其更改为 app.get('/getProduce',(req,res))
和与 html 链接的 CSS 文件。
【讨论】:
【参考方案2】:如果您使用的是 node.js (with express)
如果你想在 node.js 中提供静态文件,你需要使用一个函数。将以下代码添加到您的 js 文件中:
app.use(express.static("public"));
应用在哪里:
const express = require("express");
const app = express();
然后在您的项目文件夹中创建一个名为 public 的文件夹。 (您可以将其称为其他名称,这只是一种好习惯,但请记住也要从函数中更改它。)
然后在此文件中创建另一个名为 css 的文件夹(和/或 css 下的图像文件,如果您也想提供静态图像。)然后将您的 css 文件添加到此文件夹。
添加它们后,相应地更改样式表。例如,如果是:
href="cssFileName.css"
和
src="imgName.png"
制作它们:
href="css/cssFileName.css"
src="css/images/imgName.png"
应该可以的??
【讨论】:
【参考方案3】:对于 Windows 用户:
如果此问题发生在您的自托管服务器(例如: 您的自定义 CDN)上,并且浏览器 (Chrome) 在尝试加载您的 javascript 文件时显示类似... ('text/plain') is not executable ...
...
这是你需要做的:
-
打开注册表编辑器即
Win + R > regedit
前往HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.js
检查内容类型是否为application/javascript
如果不是,则将其更改为application/javascript
,然后重试
【讨论】:
它不存在,我已经创建它并重新启动,但唉,同样的错误。编辑:我是为 pgadmin4 做的在常见问题解答中找到它pgadmin.org/faq 他们建议text/javascript
【参考方案4】:
就我而言,我在nginx
上关闭了X-Content-Type-Options
,然后工作正常。但请确保这会稍微降低您的安全级别。将是一个临时修复。
# Not work
add_header X-Content-Type-Options nosniff;
# OK (comment out)
#add_header X-Content-Type-Options nosniff;
对于 apache 也是如此。
<IfModule mod_headers.c>
#Header set X-Content-Type-Options nosniff
</IfModule>
【讨论】:
这个解决方案对我来说很好文件伪装另一个扩展名时的另一种解决方案
我在var.js
文件中使用php
和这个.htaccess
。
<Files var.js>
AddType application/x-httpd-php .js
</Files>
然后我在.js文件中编写php代码
<?php
// This is a `.js` file but works with php
echo "var js_variable = '$php_variable';";
当我在 Chrome 上收到 MIME 类型警告时,我通过在 .js(but php)
文件中添加 Content-Type
标题行来修复它。
<?php
header('Content-Type: application/javascript'); // <- Add this line
// This is a `.js` file but works with php
...
浏览器不会执行 .js
文件,因为 apache 将文件的 Content-Type
标头发送为 application/x-httpd-php
中定义的 .htaccess
。这是安全原因。但是apache不会执行php,因为htaccess
命令模拟,这是必要的。所以我们需要用php函数header()
覆盖apache的Content-Type
header。我猜想当 php 之前发送它而不是 apache 时,apache 会停止发送自己的 header。
【讨论】:
【参考方案6】:也遇到过同样的问题,
如果无法解决问题可以在命令行运行以下命令chrome.exe --user-data-dir="C://Chrome dev session" --disable-web-security
注意:您必须导航到 chrome 的安装路径。
例如:cd C:\Program Files\Google\Chrome\Application
将打开一个开发者会话 chrome 浏览器,您现在可以在新的 chrome 浏览器上启动您的应用。 我希望这会有所帮助
【讨论】:
同意.. 但仅用于开发角度.. 为生产添加适当的 mime 类型。 自此日期起,此标志不再用于禁用 MIME 类型检查 也不适合我...【参考方案7】:服务器应该以正确的 MIME 类型响应 JSONP application/javascript
并且你的请求应该告诉 jQuery 你正在加载 JSONP dataType: 'jsonp'
详情请见this answer!
您也可以have a look a this one,因为它解释了为什么使用text/plain
加载.js
文件不起作用。
【讨论】:
以上是关于禁用 Chrome 严格的 MIME 类型检查的主要内容,如果未能解决你的问题,请参考以下文章
拒绝执行脚本,因为 MIME 类型 ('text/html') 不可执行,并且启用了严格的 MIME 类型检查
拒绝执行脚本,因为它的 MIME 类型 ('text/html') 不可执行,并且启用了严格的 MIME 类型检查
拒绝执行脚本,因为它的 MIME 类型 ('text/html') 不可执行并且启用了严格的 MIME 类型检查
拒绝从 '*' 执行脚本,因为它的 MIME 类型 ('application/json') 不可执行,并且启用了严格的 MIME 类型检查