1

请我需要帮助,我检查了所有谷歌并没有得到真正的答案来打开我的问题。我想用头盔来保护我的快递服务器。但是当我使用它时,我收到此错误:ERR_BLOCKED_BY_RESPONSE.NotSameOrigin 200 用于从我的数据库中加载我的图像。这是我的服务器快递:

// Initialize server
const app = express()
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(cookieParser());
app.use(cors())
app.use(helmet())

// CORS configuration
app.use(function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

我从我的数据库中获取我的图像,所以 localhost 中的 url 是:http://localhost:3000/image/<name_image>

当我不使用头盔时,一切正常。

请任何帮助

4

4 回答 4

4

tl;dr:禁用Cross-Origin-Embedder-Policy,在 Helmet v5 中默认启用。

app.use(
  helmet({
    crossOriginEmbedderPolicy: false,
    // ...
  })
);

头盔维护者在这里。

Helmet 将HTTPCross-Origin-Embedder-Policy响应标头设置为require-corp.

设置此标头意味着加载跨域资源(如来自另一个资源的图像)更加棘手。例如,加载这样的跨域...

<img alt="My picture" src="https://example.com/image.png">

example.com...除非通过设置自己的一些响应标头明确允许,否则将不起作用。您的浏览器将尝试加载example.com/image.png,如果未明确允许,您的浏览器将丢弃响应。

要解决此问题,您可以阻止 Helmet 设置Cross-Origin-Embedder-Policy标题,如下所示:

app.use(
  helmet({
    crossOriginEmbedderPolicy: false,
    // ...
  })
);

我制作了一个小示例应用程序,您可以使用它来玩这个。在我的测试中,它似乎在 HTTP 中不起作用,但它通过HTTPS 起作用,这可能解释了为什么事情只会在生产中中断。

于 2022-01-18T15:04:43.060 回答
1

在谷歌上看了很长时间后,我从这里得到了解决方案: https ://github.com/helmetjs/helmet/issues/176 我添加了这一行:

res.setHeader('Cross-Origin-Resource-Policy', 'same-site');

并且只需刷新和清除缓存(MAC 上的 cmd + R 和其他人的 ctrl+R ),它就像一个魅力。谢谢埃文哈恩

于 2022-01-18T09:01:41.147 回答
0

就我而言,我用这种方式

    helmet({
      crossOriginResourcePolicy: false,
    })

问题在于跨域资源策略应该与浏览器视为另一个来源相同的站点。

于 2022-02-26T19:35:41.437 回答
0

如果版本控制对您来说是一个更好的选择,我在头盔上遇到了同样的问题>=5.0.0。下降以4.6.0解决此错误。

于 2022-02-26T21:35:16.070 回答