Antworten:
So können Sie CORS-Anforderungen mit curl debuggen.
Senden einer regulären CORS-Anfrage mit cUrl:
curl -H "Origin: http://example.com" --verbose \
https://www.googleapis.com/discovery/v1/apis?fields=
Das -H "Origin: http://example.com"
Flag ist die Domain eines Drittanbieters, die die Anforderung stellt. Ersetzen Sie in welcher Domain auch immer.
Das --verbose
Flag druckt die gesamte Antwort aus, sodass Sie die Anforderungs- und Antwortheader sehen können.
Die oben verwendete URL ist eine Beispielanforderung an eine Google-API, die CORS unterstützt. Sie können jedoch die von Ihnen getestete URL ersetzen.
Die Antwort sollte den Access-Control-Allow-Origin
Header enthalten.
Senden einer Preflight-Anfrage mit cUrl:
curl -H "Origin: http://example.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: X-Requested-With" \
-X OPTIONS --verbose \
https://www.googleapis.com/discovery/v1/apis?fields=
Dies ähnelt der regulären CORS-Anfrage mit einigen Ergänzungen:
Die -H
Flags senden zusätzliche Preflight-Anforderungsheader an den Server
Das -X OPTIONS
Flag zeigt an, dass dies eine HTTP OPTIONS-Anforderung ist.
Wenn die Preflight - Anforderung erfolgreich ist, sollte die Reaktion umfassen die Access-Control-Allow-Origin
, Access-Control-Allow-Methods
und Access-Control-Allow-Headers
Response - Header. Wenn die Preflight-Anforderung nicht erfolgreich war, sollten diese Header nicht angezeigt werden, oder die HTTP-Antwort lautet nicht 200.
Sie können auch zusätzliche Header angeben, z. B. User-Agent
mithilfe des -H
Flags.
--verbose
oben erwähnte Option hinzufügen .
--head
:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/file
.
curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
Access-Control-Allow-*
unterstützt Ihre Ressource CORS.Begründung für eine alternative Antwort
Ich google diese Frage ab und zu und die akzeptierte Antwort ist nie das, was ich brauche. Zuerst wird ein Antworttext gedruckt, der viel Text enthält. Hinzufügen von --head
Ausgaben nur Header. Zweitens müssen wir beim Testen von S3-URLs zusätzlichen Header bereitstellen -H "Access-Control-Request-Method: GET"
.
Hoffe das spart Zeit.
--head
dass Curl die Überschriften ausdrucken lässt, aber es führt auch dazu, dass Curl HEAD
eher eine Anfrage als eine GET
. Je nachdem, was Sie testen, möchten Sie möglicherweise eine GET
Anfrage stellen. Sie können dies tun, indem Sie hinzufügen --IXGET
.
Das Bash-Skript "corstest" unten funktioniert für mich. Es basiert auf Juns Kommentar oben.
Verwendung
corstest [-v] url
Beispiele
./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *
Das positive Ergebnis wird grün angezeigt
./corstest https://github.com/IonicaBizau/jsonrequest
https://github.com/IonicaBizau/jsonrequest does not support CORS
you might want to visit https://enable-cors.org/ to find out how to enable CORS
Das negative Ergebnis wird in rot und blau angezeigt
Die Option -v zeigt die vollständigen Curl-Header an
corstest
#!/bin/bash
# WF 2018-09-20
# https://stackoverflow.com/a/47609921/1497139
#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'
red='\033[0;31m'
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'
#
# a colored message
# params:
# 1: l_color - the color of the message
# 2: l_msg - the message to display
#
color_msg() {
local l_color="$1"
local l_msg="$2"
echo -e "${l_color}$l_msg${endColor}"
}
#
# show the usage
#
usage() {
echo "usage: [-v] $0 url"
echo " -v |--verbose: show curl result"
exit 1
}
if [ $# -lt 1 ]
then
usage
fi
# commandline option
while [ "$1" != "" ]
do
url=$1
shift
# optionally show usage
case $url in
-v|--verbose)
verbose=true;
;;
esac
done
if [ "$verbose" = "true" ]
then
curl -s -X GET $url -H 'Cache-Control: no-cache' --head
fi
origin=$(curl -s -X GET $url -H 'Cache-Control: no-cache' --head | grep -i access-control)
if [ $? -eq 0 ]
then
color_msg $green "$url $origin"
else
color_msg $red "$url does not support CORS"
color_msg $blue "you might want to visit https://enable-cors.org/ to find out how to enable CORS"
fi
Scheint so, als ob genau das funktioniert:
curl -I http://example.com
Suchen Sie Access-Control-Allow-Origin: *
in den zurückgegebenen Headern
*
dies nicht funktioniert, wenn Anmeldeinformationen wie ein Cookie mit der API-Anforderung angezeigt werden müssen. In diesem Fall ist der FQDN auch in der Access-Control-Allow-Origin
Antwort erforderlich Access-Control-Allow-Credentials: true
. Anmeldeinformationen mit Anmeldeinformationen wurden von OP jedoch nicht als Anforderung angegeben und *
funktionieren daher für nicht authentifizierte Anforderungen.