Câu trả lời:
Đây là cách bạn có thể gỡ lỗi các yêu cầu CORS bằng cách sử dụng curl.
Gửi yêu cầu CORS thông thường bằng cUrl:
curl -H "Origin: http://example.com" --verbose \
https://www.googleapis.com/discovery/v1/apis?fields=
Các -H "Origin: http://example.com"
lá cờ là miền của bên thứ ba đưa ra yêu cầu. Thay thế trong bất kỳ tên miền của bạn là gì.
Các --verbose
bản in cờ ra toàn bộ phản ứng, do đó bạn có thể thấy các tiêu đề yêu cầu và trả lời.
Url tôi đang sử dụng ở trên là một yêu cầu mẫu cho API Google hỗ trợ CORS, nhưng bạn có thể thay thế bất kỳ url nào bạn đang kiểm tra.
Các phản ứng nên bao gồm Access-Control-Allow-Origin
tiêu đề.
Gửi một yêu cầu preflight bằng 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=
Điều này trông tương tự như yêu cầu CORS thông thường với một vài bổ sung:
Các -H
cờ gửi tiêu đề yêu cầu preflight bổ sung đến máy chủ
Các -X OPTIONS
lá cờ chỉ ra rằng đây là một yêu cầu HTTP OPTIONS.
Nếu yêu cầu preflight là thành công, phản ứng nên bao gồm Access-Control-Allow-Origin
, Access-Control-Allow-Methods
và Access-Control-Allow-Headers
tiêu đề phản ứng. Nếu yêu cầu preflight không thành công, những tiêu đề này sẽ không xuất hiện hoặc phản hồi HTTP sẽ không phải là 200.
Bạn cũng có thể chỉ định các tiêu đề bổ sung, chẳng hạn như User-Agent
bằng cách sử dụng -H
cờ.
--verbose
tùy chọn, như đã đề cập ở trên.
--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-*
thì tài nguyên của bạn hỗ trợ CORS.Lý do cho câu trả lời thay thế
Tôi google câu hỏi này mọi lúc và câu trả lời được chấp nhận không bao giờ là thứ tôi cần. Đầu tiên, nó in phần thân phản hồi, rất nhiều văn bản. Thêm --head
đầu ra chỉ tiêu đề. Thứ hai khi kiểm tra URL S3, chúng tôi cần cung cấp tiêu đề bổ sung -H "Access-Control-Request-Method: GET"
.
Hy vọng điều này sẽ tiết kiệm thời gian.
--head
việc tạo curl in ra các tiêu đề, nhưng nó cũng làm cho curl thực hiện một HEAD
yêu cầu chứ không phải là một GET
. Tùy thuộc vào những gì bạn đang thử nghiệm, bạn có thể muốn đưa ra GET
yêu cầu. Bạn có thể làm điều này bằng cách thêm --IXGET
.
Kịch bản bash "corstest" dưới đây hoạt động với tôi. Nó dựa trên nhận xét của Jun ở trên.
sử dụng
url [-v]
ví dụ
./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *
kết quả dương tính được hiển thị bằng màu xanh lá cây
./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
kết quả âm tính được hiển thị màu đỏ và màu xanh
tùy chọn -v sẽ hiển thị các tiêu đề cuộn tròn đầy đủ
xác chết
#!/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
Có vẻ như chỉ hoạt động này:
curl -I http://example.com
Tìm kiếm Access-Control-Allow-Origin: *
trong các tiêu đề trở lại
*
nó không hoạt động nếu thông tin đăng nhập như cookie cần phải được trình bày với yêu cầu API. Trong trường hợp đó, FQDN được yêu cầu trong Access-Control-Allow-Origin
phản hồi cũng như Access-Control-Allow-Credentials: true
. Các yêu cầu được xác thực mặc dù không được chỉ định theo yêu cầu của OP, do đó, *
hoạt động cho mọi yêu cầu không được xác thực.