标签: cors

如何在 NGINX 中添加 Access-Control-Allow-Origin?

如何设置 Access-Control-Allow-Origin 标头,以便我可以在主域上使用子域中的网络字体?


笔记:

您将在 HTML5BP 服务器配置项目https://github.com/h5bp/server-configs 中找到大多数 HTTP 服务器的此标头和其他标头的示例

nginx cors

205
推荐指数
6
解决办法
60万
查看次数

Chrome S3 Cloudfront:初始 XHR 请求中没有“Access-Control-Allow-Origin”标头

我有一个网页 ( 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, …

google-chrome amazon-s3 amazon-cloudfront jquery cors

45
推荐指数
2
解决办法
3万
查看次数

在 Cloudfront 上设置 Access-Control-Allow-Origin

我在使用 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

22
推荐指数
2
解决办法
5万
查看次数

nginx if 语句在 location 中返回 404

下面的块

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指令,所以:

  1. 这与nginx的IfIsEvil有关吗?

  2. 如果是,那么是否有其他方法可以http_origin通过不使用 if 语句来测试?

我已经用 nginx > 1.4 (1.4.6, 1.7, 1.7.8) 试过了。

nginx cors

11
推荐指数
1
解决办法
5261
查看次数

如何使用 nginx 替换代理响应中的 Access-Control-Allow-Origin 标头

我正在使用一个简单的 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 服务器返回的标头,以便只有我的标头版本出现在最终响应中?

nginx cors

11
推荐指数
2
解决办法
2万
查看次数

使用托管 CORS-With-Preflight 策略对 CloudFront 分配的 OPTIONS 请求返回 403

我有一个 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)

amazon-cloudfront amazon-web-services cors

9
推荐指数
1
解决办法
4977
查看次数

已加载 Apache 标头模块但无法在 htaccess 中设置标头

我在我的新开发机器 (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)

.htaccess httpd.conf http-headers apache-2.2 cors

8
推荐指数
1
解决办法
8723
查看次数

禁用 HTTP OPTIONS 方法的身份验证(预检请求)

CORS 的一个反复出现的问题是规范规定请求标头从预检请求(HTTP OPTIONS)中剥离。但是,如果服务器需要身份验证,这意味着预检请求将失败(因为Authorization未包含标头)并且它将无法接收所需的access-control-allow-origin标头。

唯一的出路似乎是将服务器配置为不对 HTTP OPTIONS 请求强制进行身份验证。在 apache 2.4 中有什么方法可以让我Require valid-user以 http 方法为条件吗?

http authentication apache-2.2 apache-2.4 cors

7
推荐指数
1
解决办法
6503
查看次数

在 Nginx 中禁用 HTTP OPTIONS 方法(预检请求)的身份验证

我的问题与此处描述的完全相同: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)

nginx cors

6
推荐指数
1
解决办法
2万
查看次数

304 在 apache 上使用 CORS

我有一个 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 ”。

apache-2.4 cors

6
推荐指数
1
解决办法
1643
查看次数