Làm thế nào bạn có thể gỡ lỗi một yêu cầu CORS với cURL?


300

Làm thế nào bạn có thể gỡ lỗi các yêu cầu CORS bằng cURL? Cho đến nay tôi không thể tìm thấy bất kỳ cách nào để "mô phỏng" yêu cầu preflight.

Câu trả lời:


496

Đâ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 --verbosebả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-Origintiê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 -Hcờ gửi tiêu đề yêu cầu preflight bổ sung đến máy chủ

Các -X OPTIONSlá 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-MethodsAccess-Control-Allow-Headerstiê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-Agentbằng cách sử dụng -Hcờ.


2
trang đó dường như không trả về bất kỳ tiêu đề CORS nào, điều đó có đúng không?
Janus Troelsen

1
Để xem các tiêu đề thực tế, bạn cần thêm --verbosetùy chọn, như đã đề cập ở trên.
thứ

10
hoặc --head:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
John Bachir

2
Sử dụng - bao gồm để xem các tiêu đề.
Mika Tuupola

7
Trong trường hợp của S3, các tiêu đề theo chỉ được thêm vào nếu phương thức thích hợp được đưa ra, bạn có thể làm như vậy bằng cách sử dụng curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/file.
Joscha

52

Câu trả lời cập nhật bao gồm hầu hết các trường hợp

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Thay thế http://www.example.com/ bằng URL bạn muốn kiểm tra.
  2. Nếu phản hồi bao gồm 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.


2
nếu tôi cuộn tròn mà không thiết lập nguồn gốc và tôi có thể nhận được phản hồi và các tiêu đề (bao gồm tiêu đề kiểm soát truy cập-kiểm soát nguồn gốc), điều đó có nghĩa là tôi thiết lập CORS không chính xác? curl -X GET ' endpoint.com ' -H 'Cache-Control: no-cache' --head
Jun711

hình tương tự @Jun
Lukas Lukac

1
Điều này phụ thuộc vào --headviệ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 HEADyê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 GETyêu cầu. Bạn có thể làm điều này bằng cách thêm --IXGET.
Aidan Fitzpatrick

2
Đây không phải là ngược? Không phải nguồn gốc là example.com chứ?
Dustin Ingram

4

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

thêm tiêu đề Origin sẽ làm cho nó tốt hơn e g. -H 'nguồn gốc: mydomain.xyz '
Bas

3

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


3
Hãy nhớ rằng *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-Originphả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.
GameSalutes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.