Nhận URL cuối cùng sau khi cuộn tròn được chuyển hướng


110

Tôi cần lấy URL cuối cùng sau khi chuyển hướng trang tốt hơn là bằng curl hoặc wget.

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

Nội dung rất 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 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ụ tích hợp sẵn của Linux không? (chỉ dòng lệnh)

Câu trả lời:


191

curlcủa -wtùy chọn và biến phụ url_effectivelà những gì bạn đang tìm kiếm.

Cái gì đó như

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

Thêm thông tin

-L Theo dõi chuyển hướng
-s Chế độ im lặng. Không xuất bất cứ thứ gì
-o FILE Ghi đầu ra vào <file> thay vì stdout
-w ĐỊNH DẠNG Những gì cần xuất sau khi hoàn thành

Hơn

Bạn có thể muốn thêm -I(đó là chữ hoa i), điều này sẽ làm cho lệnh không tải xuống bất kỳ "nội dung" nào, nhưng sau đó nó cũng sử dụng phương thức HEAD, không phải là những gì câu hỏi bao gồm và có nguy cơ thay đổi những gì máy chủ thực hiện. Đô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
Gavin Mogan

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

1
Đó là một tính năng của shell hơn là curl
user151841

1
@DanielStenberg mà bạn cần -Inếu không nó sẽ thực sự tải xuống tệp.
Steven Penny

2
Một số trang web cũng cần một tác nhân người dùng giả mạo curl -A ...để chuyển hướng đến vị trí mong đợi.
Ivan Kozik

29

Cảm ơn, điều đó đã giúp tôi. Tôi đã thực hiện một số cải tiến và gói nó trong một tập lệnh trợ giúp "finalurl":

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o xuất ra /dev/null
  • -I không thực sự tải xuống, chỉ khám phá URL cuối cùng
  • -s chế độ im lặng, không có thanh tiến trình

Điều này làm cho nó có thể gọi lệnh từ các tập lệnh khác như sau:

echo `finalurl http://someurl/`

2
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 tin .bashrc của tôi như là một chức năng, và không có nhu cầu sử dụng tùy chọn ngắn gọn trong tập tin đó, vì vậy tôi sử dụng những cái tên dài để tự tài liệu này:finalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0

7

như một tùy chọn khác:

$ 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 vượt qua cái đầu tiên.


6

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

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


Thay thế từ -O /dev/nullchỉ -O-. Tốt hơn:wget -O- --content-disposition example.com
Maxwel Leite

1
wget -O / dev / null --content-disposition example.com và wget -O- / dev / null --content-disposition example.com tạo ra nhiều đầu ra hơn so với URL được chuyển hướng. curl $ 1 -s -L -I -o / dev / null -w '% {url_effective}' phù hợp với tôi.
Eric Klien

5

Cảm ơn bạn. Tôi đã kết thúc việc triển khai các đề 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ả về trống nếu trang web không chuyển hướng, nhưng điều đó đủ tốt cho tôi vì nó hoạt động trên các chuyển hướng liên tiếp.

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


2

Điều này sẽ hoạt động:

 curl -I somesite.com | perl -n -e '/^Location: (.*)$/ && print "$1\n"'

2

Các tham số -L (--location)-I (--head)vẫn thực hiện yêu cầu HEAD không cần thiết đối với url vị trí.

Nếu bạn chắc chắn rằng bạn sẽ không có nhiều hơn một chuyển hướng, tốt hơn là bạn nên tắt vị trí theo dõi và sử dụng curl-biến% {redirect_url}.

Mã này chỉ thực hiện một yêu cầu HEAD đến URL được chỉ định và lấy redirect_url từ location-header:

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

Kiểm tra tốc độ

all_videos_link.txt - 50 liên kết goo.gl + bit.ly chuyển hướng đến youtube

1. Với vị trí theo dõi

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

Các kết quả:

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

2. Không theo vị trí

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

Các kết quả:

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

Có vẻ khá phổ biến mà bạn biết trước rằng sẽ chỉ có một chuyển hướng ...
SamB

1

Tôi không chắc cách thực hiện 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

0

Bạn có thể thử với nó?

#!/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"

Lưu ý: khi bạn thực hiện lệnh curl -I http://your-domain.com phải sử dụng dấu nháy đơn trong lệnh như curl -I 'http://your-domain.com'


-3

Bạn có thể sử dụng grep. không muốn nói cho bạn biết nơi nó cũng đang chuyển hướng? Chỉ cần grep ra.

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.