कर्ल पुनर्निर्देशित होने के बाद अंतिम URL प्राप्त करें


110

मुझे एक पृष्ठ के बाद अंतिम URL प्राप्त करने की आवश्यकता है जो अधिमानतः कर्ल या विग के साथ पुनर्निर्देशित करता है।

उदाहरण के लिए http://google.com http://www.google.com पर पुनर्निर्देशित हो सकता है ।

सामग्री प्राप्त करना आसान है (पूर्व curl --max-redirs 10 http://google.com -L), लेकिन मैं केवल अंतिम url (पूर्व मामले में http://www.google.com ) में रुचि रखता हूं ।

क्या केवल लिनक्स में निर्मित उपकरणों का उपयोग करके ऐसा करने का कोई तरीका है? (केवल कमांड लाइन)

जवाबों:


191

curlके -wविकल्प और उप चर url_effectiveआप के लिए क्या देख रहे है।

कुछ इस तरह

curl -Ls -o /dev/null -w %{url_effective} http://google.com

और जानकारी

-L रीडायरेक्ट का पालन करें
-s साइलेंट मोड। कुछ भी आउटपुट न करें
-o फ़ाइल को आउटपुट के बजाय <file> में लिखें
-W FORMAT पूरा होने के बाद क्या आउटपुट देना है

अधिक

आप जोड़ना चाह सकते हैं -I(जो कि एक अपरकेस i) है, जो कमांड को किसी भी "बॉडी" को डाउनलोड नहीं करेगा, लेकिन फिर वह HEAD पद्धति का भी उपयोग करता है, जिसमें वह सवाल शामिल नहीं है और जो सर्वर करता है उसे बदलने का जोखिम है। कभी-कभी सर्वर जीईटी के लिए ठीक जवाब देने पर भी हेड को अच्छी तरह से जवाब नहीं देते हैं।


4
यदि आप फ़ाइल नहीं चाहते हैं, तो आपको "-o / dev / null" का उपयोग करने में सक्षम होना चाहिए
Gavin Mogan

1
यह एक बढ़िया विकल्प है, मुझे नहीं पता था कि कर्ल ऐसा कर सकता है! यह मुझे विस्मित करना बंद नहीं करता है:-)
जोश

1
यह कर्ल की तुलना में एक शेल विशेषता से अधिक है
user151841

1
@DanielStenberg की जरूरत है -Iअन्यथा यह वास्तव में फ़ाइल डाउनलोड करेगा।
स्टीवन पेन्नी

2
कुछ वेबसाइटों curl -A ...को अपेक्षित स्थान पर पुनर्निर्देशित करने के लिए एक स्पूफ़्ड उपयोगकर्ता एजेंट की भी आवश्यकता होती है ।
इवान कोज़िक

29

धन्यवाद, इससे मुझे मदद मिली। मैंने कुछ सुधार किए और एक सहायक स्क्रिप्ट "फाइनल" में लपेटा:

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o उत्पादन करने के लिए /dev/null
  • -I वास्तव में डाउनलोड न करें, बस अंतिम URL की खोज करें
  • -s साइलेंट मोड, नो प्रोग्रेसबार

इससे इस तरह की अन्य लिपियों से कमांड को कॉल करना संभव हो गया:

echo `finalurl http://someurl/`

2
उन विचारों के लिए धन्यवाद। मैं इसे एक समारोह के रूप में अपने .bashrc फ़ाइल में टर्मिनल उपयोग के लिए फिर से लिखता हूं, और उस फ़ाइल में ट्रिक विकल्पों की कोई आवश्यकता नहीं है, इसलिए मैंने इसे स्वयं-दस्तावेज़ के लिए लंबे नामों का उपयोग किया:finalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0

7

एक अन्य विकल्प के रूप में:

$ curl -i http://google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Sat, 19 Jun 2010 04:15:10 GMT
Expires: Mon, 19 Jul 2010 04:15:10 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

लेकिन यह पहले वाले से पीछे नहीं है।


6

आप इसे आमतौर पर wget के साथ कर सकते हैं। wget --content-disposition"url" इसके अतिरिक्त यदि आप जोड़ते -O /dev/nullहैं तो आप वास्तव में फ़ाइल को सहेज नहीं पाएंगे।

wget -O /dev/null --content-disposition example.com


से -O /dev/nullही बदलें -O-। बेहतर:wget -O- --content-disposition example.com
मैक्सवेल लेइट

1
wget -O / dev / null --content-disposition example.com और wget -O- / dev / null --content-disposition example.com redirected URL की तुलना में बहुत अधिक आउटपुट उत्पन्न करते हैं। कर्ल $ 1 -s -L -I -o / dev / null -w '% {url_effective}' मेरे लिए ठीक काम करता है।
एरिक कालिन

5

धन्यवाद। मैंने आपके सुझावों को लागू करना समाप्त कर दिया: कर्ल-आई + जीआरपी

curl -i http://google.com -L | egrep -A 10 '301 Moved Permanently|302 Found' | grep 'Location' | awk -F': ' '{print $2}' | tail -1

यदि वेबसाइट पुनर्निर्देशित नहीं होती है, तो खाली लौटता है, लेकिन यह मेरे लिए काफी अच्छा है क्योंकि यह लगातार पुनर्निर्देशन पर काम करता है।

छोटी गाड़ी हो सकती है, लेकिन एक नज़र में यह ठीक काम करती है।



2

पैरामीटर -L (--location)और -I (--head)अभी भी स्थान-url के लिए अनावश्यक HEAD-request कर रहे हैं।

यदि आप सुनिश्चित हैं कि आपके पास एक से अधिक रीडायरेक्ट नहीं होंगे, तो बेहतर होगा कि फॉलो लोकेशन को निष्क्रिय कर दिया जाए और कर्ल-चर% {redirect_url} का उपयोग किया जाए।

यह कोड निर्दिष्ट URL में केवल एक हीड-अनुरोध करता है और स्थान-हेडर से पुनर्निर्देशन लेता है:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://""goo.gl/QeJeQ4"

गति परीक्षण

all_videos_link.txt - goo.gl + bit.ly के 50 लिंक जो यूट्यूब पर रीडायरेक्ट होते हैं

1. स्थान का पालन करें

time while read -r line; do
    curl -kIsL -w "%{url_effective}\n" -o /dev/null  $line
done < all_videos_link.txt

परिणाम:

real    1m40.832s
user    0m9.266s
sys     0m15.375s

2. बिना लोकेशन के

time while read -r line; do
    curl -kIs -w "%{redirect_url}\n" -o /dev/null  $line
done < all_videos_link.txt

परिणाम:

real    0m51.037s
user    0m5.297s
sys     0m8.094s

बहुत ही असामान्य लगता है कि आप पहले से ही जानते हैं कि केवल एक ही पुनर्निर्देशित होगा ...
सैमबी

1

मुझे यकीन नहीं है कि इसे कर्ल के साथ कैसे किया जाए, लेकिन libwww-perl GET उर्फ ​​स्थापित करता है।

$ GET -S -d -e http://google.com
GET http://google.com --> 301 Moved Permanently
GET http://www.google.com/ --> 302 Found
GET http://www.google.ca/ --> 200 OK
Cache-Control: private, max-age=0
Connection: close
Date: Sat, 19 Jun 2010 04:11:01 GMT
Server: gws
Content-Type: text/html; charset=ISO-8859-1
Expires: -1
Client-Date: Sat, 19 Jun 2010 04:11:01 GMT
Client-Peer: 74.125.155.105:80
Client-Response-Num: 1
Set-Cookie: PREF=ID=a1925ca9f8af11b9:TM=1276920661:LM=1276920661:S=ULFrHqOiFDDzDVFB; expires=Mon, 18-Jun-2012 04:11:01 GMT; path=/; domain=.google.ca
Title: Google
X-XSS-Protection: 1; mode=block

0

क्या आप इसके साथ प्रयास कर सकते हैं?

#!/bin/bash 
LOCATION=`curl -I 'http://your-domain.com/url/redirect?r=something&a=values-VALUES_FILES&e=zip' | perl -n -e '/^Location: (.*)$/ && print "$1\n"'` 
echo "$LOCATION"

नोट: जब आप कमांड को क्रियान्वित करते हैं तो कर्ल -I http://your-domain.com को कमांड में सिंगल कोट्स का उपयोग करना होगा curl -I 'http://your-domain.com'


-3

आप grep का उपयोग कर सकते हैं। आपको यह नहीं बताता कि यह कहाँ पुनर्निर्देशित है? बस कि बाहर grep।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.