Odpowiedzi:
Oto, w jaki sposób można debugować żądania CORS za pomocą curl.
Wysyłanie zwykłego żądania CORS za pomocą cUrl:
curl -H "Origin: http://example.com" --verbose \
https://www.googleapis.com/discovery/v1/apis?fields=
The -H "Origin: http://example.com"
Flaga jest trzecia domena strona składająca wniosek. Zastępuj w jakiejkolwiek domenie.
The --verbose
drukuje całej odpowiedzi flag, dzięki czemu można zobaczyć nagłówków żądania i odpowiedzi.
Adres URL, którego używam powyżej, jest przykładowym żądaniem do interfejsu API Google, który obsługuje CORS, ale możesz go zastąpić dowolnym testowanym adresem URL.
Odpowiedź powinna zawierać Access-Control-Allow-Origin
nagłówek.
Wysyłanie żądania inspekcji wstępnej za pomocą 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=
Wygląda podobnie do zwykłego żądania CORS z kilkoma dodatkami:
Te -H
flagi wysłać dodatkowe nagłówki żądania do serwera inspekcji wstępnej
-X OPTIONS
Flaga wskazuje, że jest to żądanie HTTP OPTIONS.
Jeżeli wniosek inspekcji wstępnej jest udane, odpowiedź powinna zawierać Access-Control-Allow-Origin
, Access-Control-Allow-Methods
oraz Access-Control-Allow-Headers
nagłówki odpowiedzi. Jeśli żądanie inspekcji wstępnej nie powiodło się, nagłówki te nie powinny się pojawić lub odpowiedź HTTP nie będzie wynosić 200.
Możesz także określić dodatkowe nagłówki, na przykład User-Agent
używając -H
flagi.
--verbose
opcję, jak wspomniano powyżej.
--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-*
to, że Twój zasób obsługuje CORS.Uzasadnienie alternatywnej odpowiedzi
Przeglądam to pytanie od czasu do czasu, a zaakceptowana odpowiedź nigdy nie jest tym, czego potrzebuję. Najpierw drukuje treść odpowiedzi, która jest dużą ilością tekstu. Dodawanie --head
wyjść tylko nagłówki. Po drugie, podczas testowania adresów URL S3 musimy podać dodatkowy nagłówek-H "Access-Control-Request-Method: GET"
.
Mam nadzieję, że pozwoli to zaoszczędzić czas.
--head
że curl drukuje nagłówki, ale powoduje również, że curl wysyła HEAD
żądanie, a nie GET
. W zależności od tego, co testujesz, możesz złożyć GET
wniosek. Możesz to zrobić, dodając --IXGET
.
Poniższy skrypt bash „najstraszniejszy” działa dla mnie. Opiera się na Jun powyższym komentarzu .
stosowanie
corstest [-v] url
przykłady
./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *
wynik dodatni jest wyświetlany na zielono
./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
wynik ujemny jest wyświetlany na czerwono i niebiesko
opcja -v pokaże pełne nagłówki zwijania
najstraszniejszy
#!/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
Wygląda na to, że to po prostu działa:
curl -I http://example.com
Poszukaj Access-Control-Allow-Origin: *
w zwróconych nagłówkach
*
to nie działa, jeśli poświadczenia, takie jak plik cookie, muszą zostać przedstawione wraz z żądaniem interfejsu API. W takim przypadku nazwa FQDN jest wymagana również w Access-Control-Allow-Origin
odpowiedzi Access-Control-Allow-Credentials: true
. Żądania poświadczone, chociaż nie zostały określone przez OP, więc *
działa w przypadku wszystkich nieuwierzytelnionych żądań.