Access-Control-Allow-Origin "*" не допускается, если флаг учетных данных имеет значение true
У меня есть запрос AJAX, который подключается к http://example.com:6001
,
Тем не менее, он будет работать только когда я открою http://example.com:6001
в браузере, который загружает index.html (который запускается через Node.js через порт 6001). Это работает нормально, и AJAX возвращает:
XHR завершил загрузку: http://example.com:6001/_api/
Однако, когда я открываю index.html с моего сервера Apache на:80, вызов ajax вернет:
XMLHttpRequest не может загрузить http://example.com/_api/?xxx. Подстановочный знак "*" не может использоваться в заголовке "Access-Control-Allow-Origin", если флаг учетных данных имеет значение true. Происхождение " 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.ini
Couch DB (из документации по обмену ресурсами между источниками):
[httpd]
enable_cors = true
[cors]
origins = *
credentials = false
Последнее имеет смысл, потому что, кажется, указывает на credentials
флаг..
Это также не должен быть сценарий, потому что он работает в одном и том же "домене порта" (то есть:6001).
2 ответа
Эта ошибка возвращается вашим браузером.
В основном означает, что вы просто не можете этого сделать.
Заголовки, связанные с CORS, не должны быть установлены в Apache (в вашем случае)
Создайте это в своем приложении NodeJS с указанным доменом: порт, а не подстановочный знак.
Вот похожий случай, вы можете посмотреть
Я не знаю NodeJS. В PHP вы можете использовать
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);
смоделировать подстановочный знак.
Пункт 6.1.3 "Простой запрос источника, фактический запрос и перенаправления" не позволяет серверу ресурсов отвечать разрешением с подстановочными знаками, когда ресурс ожидает учетные данные.
Я предполагаю, что это защищает от разработчиков, слепо выставляющих ресурсы, защищенные учетными данными, любому возможному клиенту, включая те, которые могут работать на простом http-сайте. Ответ на URL-адрес источника запроса в Access-Control-Allow-Origin, по-видимому, указывает на достаточную осведомленность разработчиков о том, что секреты могут распространяться по всему миру.
$ 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