У меня есть запрос 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», если установлен флаг учетных данных. Происхождение '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).
Эта ошибка возвращается вашим браузером.
В основном означает, что вы просто не можете этого сделать.
Заголовки, связанные с CORS, не должны быть установлены в Apache (в вашем случае)
Создайте это в своем приложении NodeJS с указанным доменом: порт, а не подстановочным знаком.
Вот похожий случай, который вы можете захотеть посмотреть
Я не знаю NodeJS. В php вы можете использовать
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);
для имитации подстановочного знака.
Пункт 6.1.3 «Простой запрос источника, фактический запрос и перенаправления» не позволяет серверу ресурсов отвечать с разрешением подстановочного знака, когда ресурс ожидает учетные данные.
http://www.w3.org/TR/cors/#resource-requests
Я предполагаю, что это защищает от разработчиков, слепо раскрывающих ресурсы, защищенные учетными данными, любому возможному клиенту, включая тех, которые могут работать на открытых 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