如何为代理网站场景正确配置CORS跨域访问设置
问题根因
你配置的CORS规则仅解决了前端请求本地代理服务的跨域问题,触发报错的核心原因是habr返回的响应自带内容安全策略(CSP) 以及X-Frame-Options这类限制嵌入的响应头,浏览器识别到这类头后会拦截非habr域名下的页面加载行为。StackOverflow默认没有配置严格的跨域嵌入限制头,因此代理可以正常运行。
除此之外,原代码直接返回habr的原始页面内容,页面内的静态资源、跳转链接都是指向habr域名的相对/绝对路径,浏览器会默认在localhost域名下请求这类资源,也会触发加载异常。
修复方案
需要对上游返回的响应头和页面内容做两层处理,首先移除所有限制嵌入的响应头,再替换页面内所有habr域名的链接为本地代理地址,修改后的代码参考如下:
app.Run(async (context) => { var url = context.Request.GetDisplayUrl() .Replace(@"https://localhost:5001", ""); var request = (HttpWebRequest)WebRequest.Create(@"https://habr.com" + url); using var response = (HttpWebResponse)request.GetResponse(); // 移除上游返回的所有限制类响应头 context.Response.Headers.Remove("Content-Security-Policy"); context.Response.Headers.Remove("X-Content-Security-Policy"); context.Response.Headers.Remove("X-Frame-Options"); context.Response.Headers.Remove("X-Xss-Protection"); // 同步上游返回的内容类型,避免浏览器解析异常 context.Response.ContentType = response.ContentType; using var resStream = response.GetResponseStream(); using var reader = new StreamReader(resStream); var htmlContent = await reader.ReadToEndAsync(); // 替换页面内所有habr域名链接为本地代理地址 htmlContent = htmlContent.Replace("https://habr.com", "https://localhost:5001"); // 如果habr使用子域名存储静态资源,可新增对应替换规则,例如: // htmlContent = htmlContent.Replace("https://static.habr.com", "https://localhost:5001/static"); await context.Response.WriteAsync(htmlContent); });
原有CORS配置无需修改,可正常使用。
内容的提问来源于stack exchange,提问作者savva
相关产品推荐
相关产品推荐

