如何让CORS使用HTTP 304而不是HTTP 200响应



目前还不清楚我的RESTful CORS响应是否从缓存中检索过。他们都有200状态代码,但从未304;即使在请求、响应以及If-None-MatchEtag报头中没有变化。

响应标头如下:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://www.acme.com
Access-Control-Max-Age: 86400
Cache-Control: no-cache
Pragma: no-cache
Vary: Cookie, Origin

虽然飞行前请求不再按请求调用,但所有其他XHR调用都返回200HTTP响应。

这个问题只发生在跨来源请求中。

编辑:以下是经过编辑的摘录:

import express from 'express';
import cors from 'cors';
const server = express();
server
.set( 'etag', 'strong' )
.use( cors({
credentials: true,
maxAge: 86400,
origin: 'http://www.acme.com'
}) )
.use(( req, res, next ) => {
res.setHeader( 'Cache-Control', 'no-cache' );
res.setHeader( 'Pragma', 'no-cache' );
res.setHeader( 'Vary', `Cookie, ${ res.get( 'Vary' ) }` );
next();
})
...

这似乎是Chrome的一个已知问题。

当处理响应与ETag匹配的条件请求时,express设置状态304并返回空有效载荷,请参阅此处。您可以使用对此进行验证

> curl -v -H "If-None-Match:..." http://server/path
< HTTP/1.1 304 Not Modified
< X-Powered-By: Express
< Access-Control-Allow-Origin: *
< Cache-Control: no-cache
< ETag: "..."

此服务器行为与请求是否跨源无关。

当Chrome浏览器接收到该响应时,它从其缓存中获取有效载荷,并将其与状态304一起显示在网络跟踪中但是,在跨来源请求的情况下,它会显示状态200。但这只是浏览器本身的产物,与服务器无关。

相关内容

  • 没有找到相关文章

最新更新