如何设置 Access-Control-Allow-Origin 标头,以便我可以在主域上使用子域中的网络字体?
笔记:
您将在 HTML5BP 服务器配置项目https://github.com/h5bp/server-configs 中找到大多数 HTTP 服务器的此标头和其他标头的示例
我有一个网页 ( https://smartystreets.com/contact ),它使用 jQuery 通过 CloudFront CDN 从 S3 加载一些 SVG 文件。
在 Chrome 中,我将打开一个隐身窗口以及控制台。然后我将加载页面。当页面加载时,我通常会在控制台中收到 6 到 8 条类似于以下内容的消息:
XMLHttpRequest cannot load
https://d79i1fxsrar4t.cloudfront.net/assets/img/feature-icons/documentation.08e71af6.svg.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'https://smartystreets.com' is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)
如果我对页面进行标准重新加载,甚至多次,我仍然会遇到相同的错误。如果我这样做,Command+Shift+R那么大多数,有时是全部图像将在没有XMLHttpRequest错误。
有时即使在图像加载后,我也会刷新并且一个或多个图像不会加载并XMLHttpRequest再次返回该错误。
我已经检查、更改并重新检查了 S3 和 Cloudfront 上的设置。在 S3 中,我的 CORS 配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)
(注意:最初只有<AllowedOrigin>*</AllowedOrigin>,同样的问题。)
在 CloudFront 中,分配行为设置为允许 HTTP Methods: GET, …
我在使用 AWS Cloudfront 向 Firefox 提供静态资产时遇到问题。
Chrome 运行良好,但 Firefox 返回 CORS 错误。
如果我执行 curl ,我会得到:
HTTP/1.1 200 OK
Content-Type: application/x-font-opentype
Content-Length: 39420
Connection: keep-alive
Date: Mon, 11 Aug 2014 21:53:50 GMT
Cache-Control: public, max-age=31557600
Expires: Sun, 09 Aug 2015 01:28:02 GMT
Last-Modified: Fri, 08 Aug 2014 19:28:05 GMT
ETag: "9df744bdf9372cf4cff87bb3e2d68fc8"
Accept-Ranges: bytes
Server: AmazonS3
Age: 2743
X-Cache: Hit from cloudfront
Via: 1.1 c445b20dfbf3128d810e975e5d84e2cd.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ...
Run Code Online (Sandbox Code Playgroud)
我认为需要标题:
Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)
谁能帮我?为什么它是 Firefox 而不是 Chrome 的问题?我该如何解决?
firefox amazon-s3 amazon-cloudfront amazon-web-services cors
下面的块
location / {
if ($http_origin ~* (https?://[^/]*\.example\.com(:[0-9]+)?)) {
add_header 'Access-Control-Allow-Origin' "$http_origin";
}
try_files $uri $uri/ /index.php?$args;
}
Run Code Online (Sandbox Code Playgroud)
… 导致 404,因为上面的代码永远不会到达try_files指令,所以:
这与nginx的IfIsEvil有关吗?
如果是,那么是否有其他方法可以http_origin通过不使用 if 语句来测试?
我已经用 nginx > 1.4 (1.4.6, 1.7, 1.7.8) 试过了。
我正在使用一个简单的 nginx 实例将 REST 调用代理到另一台服务器。我的代理的目的是允许使用 cookie 进行身份验证。我有它的工作,除了一个问题。提供 REST 服务的服务器正在发送标头Access-Control-Allow-Origin *。该标头对于基于 cookie 的身份验证过于宽松。我需要用更具限制性的标题替换该标题。
这是我的 nginx 配置的一个子集:
map $http_origin $cors_header {
default "";
"~^https?://[^/]+\.mydomain\.com(:[0-9]+)?$" $http_origin;
}
server {
location / {
proxy_pass https://myrestserver.com/api;
add_header Access-Control-Allow-Origin $cors_header;
add_header Access-Control-Allow-Credentials true;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是Access-Control-Allow-Origin我的响应中出现了两个标题。如何替换从 REST 服务器返回的标头,以便只有我的标头版本出现在最终响应中?
我有一个 CloudFront 发行版,其默认行为配置为允许任何 CORS 请求,包括预检请求。但是,OPTIONS 请求将失败并出现 HTTP 403 错误(详细信息如下),这不是我所期望的。
\n我正在使用 AWS 管理的CORS-With-Preflight策略,该策略应允许所有 CORS 请求,包括预检 (OPTIONS) 请求:
\n
\n(我不确定为什么 \xe2\x80\x9cOrigin 请求策略\xe2\x80\x9d 区域以黄色突出显示。)
\n政策详情:
\n
\n我已在行为中允许 OPTIONS 请求:
\n
\n但是,当我发送选项请求时,CloudFront 将返回此错误:
\n$ curl --request OPTIONS --url https://d3qj3h7hjzomrd.cloudfront.net/ --header \'Origin: https://www.example.com\'\n\n<?xml version="1.0" encoding="UTF-8"?>\n<Error>\n <Code>AccessForbidden</Code>\n <Message>CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Request-Headers are not whitelisted by the resource\'s CORS spec.</Message>\n <Method>OPTIONS</Method>\n <ResourceType>OBJECT</ResourceType>\n …Run Code Online (Sandbox Code Playgroud) 我在我的新开发机器 (mac) 上安装并运行了 Apache 2.2.29 (unix)。我正在尝试为 API 项目设置 CORS 标头 - 我已经做过很多次了。
该项目的 htaccess 文件如下所示:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, PATCH, DELETE"
Header set Access-Control-Allow-Headers "X-Accept-Charset,X-Accept,Content-Type"
ServerSignature Off
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /cms/public
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?p=$1 [QSA,L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)
并且 headers 模块已加载到我的 conf 中:
LoadModule headers_module libexec/mod_headers.so
Run Code Online (Sandbox Code Playgroud)
模块文件存在于 apache conf 中显示的位置,并且加载正常:
dan$ httpd -M
Loaded Modules:
core_module (static)
mpm_event_module (static)
http_module …Run Code Online (Sandbox Code Playgroud) CORS 的一个反复出现的问题是规范规定请求标头从预检请求(HTTP OPTIONS)中剥离。但是,如果服务器需要身份验证,这意味着预检请求将失败(因为Authorization未包含标头)并且它将无法接收所需的access-control-allow-origin标头。
唯一的出路似乎是将服务器配置为不对 HTTP OPTIONS 请求强制进行身份验证。在 apache 2.4 中有什么方法可以让我Require valid-user以 http 方法为条件吗?
我的问题与此处描述的完全相同:Disable authentication for HTTP OPTIONS method (preflight request)。我正在尝试同时使用 CORS 和 HTTP 密码。当浏览器看到退回的 OPTIONS(状态代码 401)时,出于某种原因,它会立即检查 CORS 标头(将不存在)并拒绝请求。
这是我的配置:
location /api/ {
proxy_pass http://127.0.0.1:14000;
proxy_set_header Host $host;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Headers "Authorization, Content-Type";
add_header Access-Control-Allow-Credentials true;
auth_basic "Restricted Area";
auth_basic_user_file /var/www/admin.htpasswd;
}
Run Code Online (Sandbox Code Playgroud) 我有一个 REST API,它返回304 Not Modified某个请求的状态代码(具有 If-Modified-Since 标头)。问题是 apache2 软件在将响应发送到浏览器之前删除了任何 CORS 标头。
仅当状态代码为 时才会发生这种情况304。任何其他端点都适用于 CORS。所有的飞行前请求也很好用。
我在互联网上读到 Apache 这样做是为了符合某些规范,但我不敢相信带有 304 的 CORS 不应该在规范中工作。
有没有办法用 apache 实现这个?
更新:
我的 javascript 是
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://api.domain.com/api/endpoint?token='+localStorage.getItem('token'));
xhr.setRequestHeader("If-Modified-Since", "Mon, 11 Jan 2016 15:46:54 GMT");
xhr.send(null);
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问源“ http://xxx.domain.com ”。
cors ×10
nginx ×4
amazon-s3 ×2
apache-2.2 ×2
apache-2.4 ×2
.htaccess ×1
firefox ×1
http ×1
http-headers ×1
httpd.conf ×1
jquery ×1