我正在尝试编写一个可以同时在http和https上处理两个站点的nginx配置,只要客户端从未访问过两个站点,它似乎就可以工作,但是如果这样做的话,则存在缓存/跨站点问题。
# Allow cross origin
location ~* \.(eot|svg|ttf|woff|woff2|json)$ {
if ($http_origin ~* (https?://(admin\.)?example\.com(:[0-9]+)?)) {
add_header 'Access-Control-Allow-Origin' "$http_origin";
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我加载example.com,则一切正常,但是当我加载admin.example.com时,会遇到类似问题
(索引):1 XMLHttpRequest无法加载 http://origin.example.com/js/data-lib/currency.json。“ Access-Control-Allow-Origin”标头具有值“ http:// example”。com”不等于提供的来源。来源'http:// admin。例子 因此,不允许访问“ com”。
据我所知,这是因为浏览器将原始请求及其附带的标头缓存了起来,现在,即使来自服务器的另一个请求允许它,它也拒绝了我。证明是,如果我在Chrome开发者工具中选中了“禁用缓存”,则该问题将永远不会发生。
我该如何解决这个问题?是否可以在一个配置中同时完成多个域+ ssl / http,还是有必要根据请求的域和协议将其拆分?
(对我示例中的可怕空间感到抱歉,显然,StackOverflow认为我在编写示例时试图发布链接)
我对它是如何工作有一个大概的了解.如果请求的"origin"标头有效(允许),则返回相同的"ORIGIN"值
但我不知道:
(更多细节,因为"当请求的凭据模式为'include'时,响应中'Access-Control-Allow-Origin'标头的值不能是通配符'*',所以我需要来自的'ORIGIN值'要求重新回复.
如果不允许使用ORIGIN,我应该返回什么?
根本不包括Access-Control-Allow-Origin标头?
或setHeader("Access-Control-Allow-Origin","")或setHeader("Access-Control-Allow-Origin","null")?
public class CORSResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
String origin = requestContext.getHeaderString("Origin");
String origin = requestContext.getHeaderString("Origin");
URL originUrl = null;
try {
if (StringUtils.hasText(origin)) {
originUrl = new URL(origin);
Pattern hostAllowedPattern = Pattern.compile("(.+\\.)*mydomain\\.com", Pattern.CASE_INSENSITIVE);
if (hostAllowedPattern.matcher(originUrl.getHost()).matches()) {
headers.add("Access-Control-Allow-Origin", origin);
} else {
headers.add("Access-Control-Allow-Origin", "");
}
headers.add("Vary", "Origin");
}
headers.add("Access-Control-Allow-Credentials", "true");
headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
headers.add("Access-Control-Allow-Headers",
Run Code Online (Sandbox Code Playgroud) 我知道这个问题已经解决,但是使用Fetch API下载图片时遇到问题。
我用来获取图像的代码。
function downloadImage() {
fetch('https://upload.wikimedia.org/wikipedia/commons/9/98/Pet_dog_fetching_sticks_in_Wales-3April2010.jpg',
{mode: 'no-cors'})
.then(response => response.blob())
.then(blob => {
console.log(blob);
});
}
Run Code Online (Sandbox Code Playgroud)
在这里,console.log我得到回应Blob {size: 0, type: ""}。
请让我知道我在这里做错了吗?
我想从网上获取一份文件xmlHttpRequest.然而,有问题的文字不是utf8(在这种情况下它是windows-1251,但在通用情况下,我肯定不知道).
但是,如果我使用responseType="text"它,就好像字符串是utf8,忽略内容类型中的字符集(导致令人讨厌的混乱).
如果我使用'blob'(可能是我想要的最接近的东西),那么考虑到编码,我可以将其转换为DomString吗?
我有一个像这样嵌入的 ReactPlayer:
<ReactPlayer
ref={this.ref}
className="storyPlayer__reactPlayer"
width="100%"
height="100%"
url="https://getleda.wistia.com/medias/bjz07hdxqx"
playing
onReady={() => {
this.setState({ ready: true });
}}
onProgress={this.onProgress}
/>
Run Code Online (Sandbox Code Playgroud)
当 url 明显指向 wistia 时,我在控制台中收到以下错误,并且播放器无法工作:
judy XMLHttpRequest 构造函数已被篡改。由于这会影响 CORS/Range XHR 请求,因此已禁用 HLS 播放。要启用 HLS 播放和其他重要功能,请删除更改 window.XMLHttpRequest 定义的代码。
有什么想法导致此问题以及如何解决吗?
我正在使用 2 个 AJAX 请求调用 2 个 API(托管在同一服务器上),但每隔几次刷新,我就会遇到
无法加载https://someapiurl:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问来源“ http://localhost:5000 ”。响应的 HTTP 状态代码为 500。
我将请求封装在“何时-那么”中,因为来自 API 的数据用于填充 2 个数据表。
$.when(
$.ajax({
url: oneurl,
dataType: "text",
cache: false,
success: function(csvs) {
onedata = csvs;
//do something
}
}),
$.ajax({
url: twourl,
dataType: "text",
cache: false,
success: function(csvr) {
twodata = csvr;
//do something
}
})
).then(function() {
tableone.rows.add(onedata).draw();
tabletwo.rows.add(twodata).draw();
});
Run Code Online (Sandbox Code Playgroud)
为什么我只是有时会收到 CORS 错误?我读到这可能与间歇性发出的 PREFLIGHT 请求有关,但如何防止这种情况呢?
我的 Django 网站使用 Nginx 托管在 digitalocean ubuntu 16.04 中。
我已经在这里设置了 digitalocean CORS 配置https://www.digitalocean.com/docs/spaces/how-to/cors/我在“来源”中添加了我的域名,检查了“允许的方法”中的所有选项,我唯一没有做的就是在“Alowed Headers”中添加标题,因为我不知道要添加什么。
当我使用 digitalocean Spaces(一种基于并与 Amazon S3 非常相似的服务)作为我的静态和媒体文件存储时。请求的资源错误中不存在“Access-Control-Allow-Origin”标头:
CORS 政策已阻止从来源“ https://kjmg.co ”访问“ https://nyc3.digitaloceanspaces.com/kjmgstorage/kjmgstorage/fonts/fontawesome-webfont.woff2?v=4.7.0 ”上的字体:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问Origin ' https://kjmg.co '。
我尝试使用 django-cors-headers,但我收到:
502 错误网关 nginx/1.10.3 (Ubuntu)
所以只好卸载了。
有朋友知道吗?非常感谢!
我正在使用 ReactJS 发出放置请求,但是,当我输入错误的电子邮件/密码组合时,即使我试图捕获所有错误并将它们显示在 Chrome 上,我也会将其登录errorDiv:
async connect(event) {
try {
const userObject = {
username: this.state.userName,
password: this.state.password
};
if (!userObject.username || !userObject.password) {
throw Error('The username/password is empty.');
}
let response = await fetch(('someurl.com'), {
method: "PUT",
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(userObject)
});
let resJSON = await response.json();
if (!response.ok) {
throw Error(resJSON.message);
}
console.info(resJSON.message);
console.info(resJSON.message.auth_token);
window.location = "/ledger/home";
} catch (e) {
document.getElementById("errorDiv").style.display = 'block';
document.getElementById("errorDiv").innerHTML = e;
}
}Run Code Online (Sandbox Code Playgroud)
我将我的 React 应用程序与 Webpack 捆绑在一起,并添加了内容安全策略 (CSP)标头(特别是不允许unsafe-evalin script-src)。当然,我确保我的最终包和块不包含eval(). 但是,最新的 Firefox-dev 63.0b10 仍然拒绝加载主块并出现以下错误:
内容安全策略:页面的设置阻止加载自身资源(“script-src”)。来源:调用 eval() 或被 CSP 阻止的相关函数。
好吧,但eval()我的捆绑包中没有。那些“相关功能”可能是什么?
PS 这是一个自我回答的问题,但请随意扩展
目前 Flutter Web 有两个后端,即 HTML 和 CanvasKit。作为库作者,出于性能原因,我想确定应用程序当前在哪个后端上运行。有没有办法在代码中检测到这一点?