2010-06-19 47 views
63

Tôi cần có url cuối cùng sau khi chuyển hướng trang tốt hơn với curl hoặc wget.Nhận url sau khi curl được chuyển hướng

Ví dụ http://google.com có thể chuyển hướng đến http://www.google.com.

Nội dung dễ lấy (ví dụ: curl --max-redirs 10 http://google.com -L), nhưng tôi chỉ quan tâm đến url cuối cùng (trong trường hợp trước là http://www.google.com).

Có cách nào để thực hiện việc này bằng cách chỉ sử dụng các công cụ xây dựng linux không? (chỉ dòng lệnh)

Trả lời

93

curl 's -w tùy chọn và biến phụ url_effective là những gì bạn đang tìm kiếm.

Something như

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

Thông tin thêm

 
-L   Follow redirects 
-s   Silent mode. Don't output anything 
-o FILE Write output to <file> instead of stdout 
-w FORMAT What to output after completion 

More

Bạn có thể muốn thêm -I (có nghĩa là một chữ hoa 'i') là tốt, mà sẽ làm cho lệnh không tải xuống bất kỳ "body" nào, nhưng nó cũng sử dụng phương thức HEAD, không phải là câu hỏi được bao gồm và thay đổi rủi ro những gì máy chủ làm. Đôi khi, máy chủ không phản hồi tốt với HEAD ngay cả khi chúng phản hồi tốt với GET.

+4

bạn sẽ có thể sử dụng "-o/dev/null" nếu bạn không muốn file –

+0

Đó là một lựa chọn tuyệt vời, tôi không bao giờ biết curl có thể làm điều đó! Nó không bao giờ ngừng làm tôi ngạc nhiên ':-)' – Josh

+1

Đó là nhiều tính năng vỏ hơn curl – user151841

-2

Bạn có thể sử dụng grep. không wget cho bạn biết nơi nó chuyển hướng quá? Chỉ cần grep mà ra.

2

Tôi không chắc chắn làm thế nào để làm điều đó với curl, nhưng libwww-perl cài đặt bí danh 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 
4

như một tùy chọn:

$ 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> 

Nhưng nó không đi qua đầu tiên.

3

Cảm ơn bạn. Tôi đã kết thúc việc triển khai đề xuất của bạn: curl -i + grep

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

Trả lại trống nếu trang web không chuyển hướng, nhưng điều đó đủ tốt cho tôi khi nó hoạt động trên các chuyển hướng liên tiếp.

Có thể bị lỗi, nhưng trong nháy mắt nó hoạt động ok.

18

Cảm ơn, điều đó đã giúp tôi.Tôi đã thực hiện một số cải tiến và được bao bọc trong một helper kịch bản "Url cuối cùng":

#!/bin/bash 
curl $1 -s -L -I -o /dev/null -w '%{url_effective}' 
  • đầu ra -o để /dev/null
  • -Tôi không thực sự tải về, chỉ cần phát hiện ra URL cuối cùng
  • -s chế độ im lặng, không progressbars

Điều này làm cho nó có thể gọi lệnh từ kịch bản khác như thế này:

echo `finalurl http://someurl/` 
+1

Cảm ơn những ý tưởng. Tôi viết lại nó để sử dụng thiết bị đầu cuối trong tệp .bashrc của tôi dưới dạng hàm và không cần các tùy chọn terse trong tệp đó, vì vậy tôi đã sử dụng tên dài để tự ghi tài liệu này: 'finalurl() {curl --silent - vị trí - đầu - đầu ra/dev/null - ghi-ra '% {url_effective}' - "$ @"; } ' – buggy3

5

Bạn có thể thực hiện điều này với wget thường. wget --content-disposition "url" bổ sung nếu bạn thêm -O /dev/null bạn sẽ không thực sự lưu tệp.

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

0

này sẽ làm việc:

curl -I somesite.com | perl -n -e '/^Location: (.*)$/ && print "$1\n"' 
Các vấn đề liên quan