Bir tarayıcı açarken neden bu bağlantıyı indirmeye kıvrılmıyor?


30

Mac OS 10.11.6 El Capitan kullanıyorum. Programlı olarak indirmek istediğim bir bağlantı var:

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg

Bu URL'yi herhangi bir tarayıcıya yapıştırırsam (örn. Safari), indirme işlemi mükemmel şekilde çalışır.

Ancak, aynı URL'yi kullanarak komut satırından indirmeyi denersem curl, çalışmaz; sonuç boş bir dosyadır:

$ ls -lA
$ curl -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
$ ls -lA
total 0
-rw-r--r--  1 myname  staff  0 Nov  7 14:07 mysql-5.7.16-osx10.11-x86_64.dmg
$ 

Tabi ki tarayıcısı üzerinden dosya alabilirsiniz, ama ben anlamak istiyorum nedencurl komut yukarıdaki işi yapmaz.

curlWeb sitesinde açıkça göründüğü ve grafiksel bir web tarayıcısından doğru bir şekilde erişilip indirilebildiği halde bu dosyayı neden doğru şekilde indiremiyorsunuz?


7
Techraf'in yönlendirmeler konusundaki cevabının tamamen doğru olmasına rağmen, başlıklar gibi diğer faktörlerin bir sunucunun curl istemcisinin bir dosyayı indirme talebini reddetmesine neden olabileceğini belirtmek isterim. Örneğin, sunucu DDoS korumasına sahipse, bu tür bir koruma yazılımı genellikle uygun bir tarayıcı gibi uygun tarayıcı başlıklarını kontrol eder User-Agent. Ek olarak, bazı tarayıcı indirmeleri oturum çerezleri (örneğin, oturum açtıysanız) yalnızca söz konusu tarayıcıda bulunduğundan başarılı olabilir.
Joseph A.,

6
Bir kıvrılma komutunu gidermek curl -viçin "ayrıntılı" için kullanabilirsiniz . Bağlantı, istek ve yanıtla ilgili çeşitli bilgileri standart hataya yazdıracaktır. Bu durumda, yanıtın HTTP 302 Found(bir yönlendirme kodu) ve Locationgidilecek URL’yi içeren bir başlık içerdiğini göreceksiniz . Sonra man curlyönlendirmeleri takip etmesini nasıl söyleyeceğini öğrenebilirsin.
Nathan Long

Yanıtlar:


59

Aşağıdaki URL'ye web sunucusu tarafında yönlendirme vardır: http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg. CDN olduğundan, tam davranış (yönlendirilip yönlendirilmeyeceğiniz) konumunuza bağlı olabilir.

curlvarsayılan olarak yönlendirmeleri izlemez. Bunu yapmak için, -Largümanı ekleyin :

curl -L -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg

6
HTTPS-HTTP yönlendirmesi? Bu korkunç, ve Curl'un onu rahat
bırakması

Ve eğer bu çözmezse? Asp şeylerle ilgisi olabilir mi?
matthick

4

Tarayıcı dosyayı indirebiliyorsa, tarayıcının ne yaptığını kontrol edebilirsiniz. Google chrome'da neler olup bittiğini görmek için aşağıdakileri kullanabilirsiniz.

1) [Görüntüle> Geliştirici> Geliştirici araçları> Ağ Sekmesi> Başlıklar sekmesi]

2) İndirme bağlantısına tıklayın.

3) Dosya bağlantısı geliştirici araçları sekmesinde görünecektir.

4) Dosyaya sağ tıklayın ve Kopyala> cURL olarak kopyala'yı seçin.

Şimdi işe yarayacak bir kıvrılma bağlantınız var. Büyük olasılıkla kesebileceğiniz aşırı parametreler olacaktır.

Daha fazla detay: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl


0

Bu yayındaki yorumlardan birini bir cevaba dönüştüreceğim.

Çalışmak için belirli başlıkları gerektiren birçok HTTP / HTTPS bağlantısı var. Böylece bu, bir web tarayıcısından çalışan bir yanıtla sonuçlanacak ancak curl gibi bir arka uç web isteğinde çalışan bir yanıtla sonuçlanmayacaktır.

Ben sadece aşağıdaki tüm başlıkları gerektiren bir siteye koştum. Bunları belirtmemek zaman aşımına uğradı.

  httpget.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36");
  httpget.setHeader("Upgrade-Insecure-Requests", "1");
  httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
  httpget.setHeader("Accept-Encoding", "gzip, deflate, br");
  httpget.setHeader("Accept-Language", "en-US,en;q=0.9");
  httpget.setHeader("Connection", "keep-alive");
  httpget.setHeader("Host", "www.thehost.com");
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.