CURL ile bir CORS isteğinde nasıl hata ayıklayabilirsiniz?


300

CURL kullanarak CORS isteklerinde nasıl hata ayıklayabilirsiniz? Şimdiye kadar ön kontrol talebini "simüle etmek" için bir yol bulamadım.

Yanıtlar:


496

Curl kullanarak CORS isteklerinde nasıl hata ayıklayabilirsiniz.

CUrl kullanarak düzenli bir CORS isteği gönderme:

curl -H "Origin: http://example.com" --verbose \
  https://www.googleapis.com/discovery/v1/apis?fields=

-H "Origin: http://example.com"Bayrak istekte üçüncü parti etki alanıdır. Alan adınız ne olursa olsun değiştirin.

--verboseTüm yanıt dışarı bayrak baskılar böylece istek ve yanıt başlıklarını görebilirsiniz.

Yukarıda kullandığım url, CORS'yi destekleyen bir Google API'sına yönelik örnek bir istektir, ancak test ettiğiniz URL'yi değiştirebilirsiniz.

Yanıt, Access-Control-Allow-Originbaşlığı içermelidir .

CUrl kullanarak ön kontrol isteği gönderme:

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=

Bu, birkaç eklemeyle normal CORS isteğine benzer:

-HBayraklar sunucuya ek uçuş öncesi isteği başlıklarını göndermek

-X OPTIONSBayrak bu bir HTTP SEÇENEKLERİ isteği olduğunu gösterir.

Uçuş öncesi isteği başarılı olursa, tepki içermelidir Access-Control-Allow-Origin, Access-Control-Allow-Methodsve Access-Control-Allow-Headerstepki başlıklarını. Ön kontrol isteği başarılı olmazsa, bu üstbilgiler görünmemelidir veya HTTP yanıtı 200 olmayacaktır.

Bayrağı User-Agentkullanarak ek başlıklar da belirleyebilirsiniz -H.


2
bu sayfa herhangi bir CORS başlığını döndürmüyor gibi görünüyor, doğru mu?
Janus Troelsen

1
Gerçek başlıkları görüntülemek için --verbose, yukarıda belirtildiği gibi seçeneği eklemeniz gerekir .
monsur

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

2
Başlıkları görmek için --include komutunu kullanın.
Mika Tuupola

7
S3 durumunda, ilgili başlıklar sadece uygun yöntem verildiğinde eklenir, bunu kullanarak yapabilirsiniz curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/file.
Joscha

52

Çoğu vakayı kapsayan güncellenmiş cevap

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Http://www.example.com/ adresini test etmek istediğiniz URL ile değiştirin .
  2. Yanıt içeriyorsa Access-Control-Allow-*, kaynağınız CORS'i destekler.

Alternatif cevap için gerekçe

Ben her zaman bu soruyu google ve kabul edilen cevap asla ihtiyacım olan şey değil. İlk olarak çok fazla metin olan yanıt gövdesini yazdırır. Ekleme --headsadece başlıkları çıkışlar. İkincisi, S3 URL'lerini test ederken ek başlık sağlamamız gerekir -H "Access-Control-Request-Method: GET".

Umarım bu zaman kazanır.


2
başlangıç ​​noktasını ayarlamadan kıvrılırsam ve yanıt ve başlıkları (erişim-denetim-izin-başlangıç ​​başlığı dahil) geri alabilirim, bu CORS'umu yanlış kurduğum anlamına mı geliyor? curl -X GET ' endpoint.com ' -H 'Önbellek Kontrolü: önbellek yok' - kafa
Jun711

Aynı figürü @Jun
Lukas Lukac

1
Bu --head, başlıkların kıvrılma baskısını yapmaya dayanır , ancak kıvrımın a HEADyerine bir istekte bulunmasını sağlar GET. Neyi test ettiğinize bağlı olarak, bir GETistekte bulunmak isteyebilirsiniz. Bunu ekleyerek yapabilirsiniz --IXGET.
Aidan Fitzpatrick

2
Bu geriye değil mi? Bunun yerine orijin ornek.com olmamalı mı?
Dustin Ingram

4

Aşağıdaki bash betiği "corstest" benim için çalışıyor. Yukarıda Jun'un yorumuna dayanmaktadır .

kullanım

en sağlam [-v] url

örnekler

./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *

pozitif sonuç yeşil renkte görüntülenir

./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

negatif sonuç kırmızı ve mavi ile gösterilir

-v seçeneği tam kıvrılma başlıklarını gösterir

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

Origin başlığını eklemek daha iyi olur. -H 'menşei: mydomain.xyz '
Bas

3

Sadece bu işe yarıyor gibi görünüyor:

curl -I http://example.com

Access-Control-Allow-Origin: *Döndürülen başlıkları arayın


3
*Bir çerez gibi kimlik bilgilerinin API isteği ile sunulması gerekiyorsa bunun işe yaramayacağını unutmayın . Bu durumda Access-Control-Allow-Originyanıtta FQDN de gereklidir Access-Control-Allow-Credentials: true. Kimlik *doğrulamalı istekler , OP tarafından bir gereksinim olarak belirtilmemiş olsa da, kimliği doğrulanmamış tüm istekler için geçerlidir.
GameSalutes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.