当凭证标志为真时,不允许 Access-Control-Allow-Origin “*”

当凭证标志为真时,不允许 Access-Control-Allow-Origin “*”

我有一个连接到的 ajax 请求http://example.com:6001

但是,只有当我http://example.com:6001在浏览器中打开时,它才会起作用,浏览器会加载 index.html(通过 Node.js 在端口 6001 上运行)。这可以正常工作,并且 ajax 返回:

XHR加载完成:http://example.com:6001/_api/

但是,当我从 :80 上的 Apache 服务器打开 index.html 时,ajax 调用将返回:

XMLHttpRequest无法加载http://example.com/_api/?xxx. 当凭证标志为真时,不能在“Access-Control-Allow-Origin”标头中使用通配符“*”。Origin 'http://example.com' 因此不允许访问。

我不确定这个错误是由 CouchDB 还是 Apache 返回的。

/etc/apache2/sites-available/000-default.conf我在Apache 中尝试了以下一些变体:

<VirtualHost *:6001>
        Header set Access-Control-Allow-Origin *
        Header set Access-Control-Allow-Credentials "false"
</VirtualHost>

并在/etc/couchdb/local.iniCouch DB(来自跨源资源共享文档):

[httpd]
enable_cors = true

[cors]
origins = *
credentials = false

最后一个最有意义,因为它似乎指出了标志credentials

它也不应该是脚本,因为它在同一个“端口域”内工作(即:6001)。

答案1

您的浏览器返回了此错误。

基本上意味着你不能这样做。

不应在 Apache 中设置 CORS 相关标头(就您而言)

在您的 NodeJS 应用程序中使用指定的域:端口(而不是通配符)生成。

你可能想看看这个类似的案例

我不知道 NodeJS。在 php 中你可以使用

header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);

模拟通配符。

答案2

第 6.1.3 款“简单来源请求、实际请求和重定向”不允许资源服务器在资源需要凭证时使用通配符权限进行响应。

http://www.w3.org/TR/cors/#resource-requests

我猜这可以防止开发人员盲目地将受凭据保护的资源暴露给任何可能的客户端,包括那些可以在普通视图 http 站点上运行的客户端。在 Access-Control-Allow-Origin 中使用请求的 Origin URL 进行回复似乎表明开发人员已经意识到允许机密在全球范围内传播。

$ curl -v https://www.googleapis.com/urlshortener/v1/url -X OPTIONS -H "Origin: http://foo" -H "Access-Control-Request-Method: GET"
* Hostname was NOT found in DNS cache
*   Trying 216.58.216.170...
* Connected to www.googleapis.com (216.58.216.170) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.storage.googleapis.com
*    start date: 2015-04-08 14:12:01 GMT
*    expire date: 2015-07-07 00:00:00 GMT
*    subjectAltName: www.googleapis.com matched
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
> OPTIONS /urlshortener/v1/url HTTP/1.1
> User-Agent: curl/7.38.0
> Host: www.googleapis.com
> Accept: */*
> Origin: http://foo
> Access-Control-Request-Method: GET
> 
< HTTP/1.1 200 OK
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: Fri, 01 Jan 1990 00:00:00 GMT
< Date: Thu, 16 Apr 2015 03:56:29 GMT
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Methods: DELETE,GET,HEAD,PATCH,POST,PUT
< Access-Control-Allow-Origin: http://foo
< Access-Control-Max-Age: 3600
< Vary: Origin
< Vary: X-Origin
< Content-Type: application/octet-stream
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
< X-XSS-Protection: 1; mode=block
< Content-Length: 0
* Server GSE is not blacklisted
< Server: GSE
< Alternate-Protocol: 443:quic,p=0.5
< 
* Connection #0 to host www.googleapis.com left intact

相关内容