Nhận mục tiêu chuyển hướng của URL với curl


24

Tôi muốn kiểm tra nơi một URL chuyển hướng duy nhất. Một ví dụ về điều đó có thể là một liên kết từ trang kết quả tìm kiếm của Google (nơi một nhấp chuột luôn đi qua máy chủ Google).

Tôi có thể làm điều đó với curl?

Câu trả lời:


18

Thử đi:

$ LOCATION=`curl -I http://raspberrypi.stackexchange.com/a/1521/86 | perl -n -e '/^Location: (.*)$/ && print "$1\n"'`
$ echo "$LOCATION"
/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521#1521

Chuyển hướng Google

URL chuyển hướng của Google hơi khác nhau. Họ trả về một chuyển hướng Javascript, có thể dễ dàng được xử lý, nhưng tại sao không xử lý URL gốc và để cuộn tròn tất cả lại với nhau?

$ URL="http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFAQFjAA&url=http%3A%2F%2Fwww.raspberrypi.org%2F&ei=rv8oUODIIMvKswa4xoHQAg&usg=AFQjCNEBMoebclm0Gk0LCZIStJbF04U1cQ"
$ LOCATION=`echo "$URL" | perl -n -e '/url=([a-zA-Z0-9%\.]*)/ && print "$1\n"'`
$ echo "$LOCATION"
http%3A%2F%2Fwww.raspberrypi.org%2F
$ echo "$LOCATION" | perl -pe 's/%([0-9a-f]{2})/sprintf("%s", pack("H2",$1))/eig'
http://www.raspberrypi.org/

Tài liệu tham khảo

  1. Để giải mã url ...

Làm thế nào về các URL đặc biệt có các ký tự đặc biệt (như chuyển hướng của Google), ví dụ: google.com/ từ
syagma

@REACHUS Chuyển hướng được mã hóa thành chuỗi truy vấn của URL đã cho.
Alex Chamberlain

@REACHUS Không phải lo lắng - bạn có thể kết hợp 2 câu lệnh perl.
Alex Chamberlain

20

Có một cách thậm chí còn dễ dàng hơn

curl -w "%{url_effective}\n" -I -L -s -S $URL -o /dev/null

nó sẽ in

http://raspberrypi.stackexchange.com/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521

cho URL

http://raspberrypi.stackexchange.com/a/1521/86

3
Điều đó sử dụng nhiều thời gian và băng thông hơn, vì bạn cũng đang tải xuống trang thứ hai.
unhammer

1
@unhammer Bạn nói đúng, cập nhật câu trả lời của tôi để chỉ yêu cầu đầu.
ismail

7

curl có thể được cấu hình để theo dõi chuyển hướng và in các biến sau khi hoàn thành. Vì vậy, những gì bạn yêu cầu có thể đạt được với lệnh sau:

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

Trang man giải thích các tham số cần thiết như thế:

-L, --location          Follow redirects (H)
-s, --silent            Silent mode (don't output anything)
-w, --write-out FORMAT  Use output FORMAT after completion
-o, --output FILE       Write to FILE instead of stdout

4

hoặc thử cái này

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86

Làm thế nào về các URL đặc biệt có các ký tự đặc biệt (như chuyển hướng của Google), ví dụ: google.com/ từ
syagma

chỉ cần đặt url trong dấu ngoặc đơn, để shell của bạn bỏ qua các ký tự đặc biệt trong liên kết. Nhưng liên kết bạn đã nêu không chuyển hướng đến một uri khác, mã trạng thái của phản hồi là 200 chứ không phải 3xx. Các uri bạn tìm kiếm được ẩn trong chính uri tương ứng trong nội dung của phản hồi. Để kiểm tra thêm, bạn có thể nghiên cứu tiêu đề của phản hồi curl -s -I 'http://yoururl'và nội dung của phản hồi với curl -s 'http://yoururl'(bạn sẽ thấy rằng google sử dụng một javascript đơn giản để chuyển hướng).
dùng1146332

0

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

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

Mã này chỉ thực hiện một yêu cầu CHÍNH đến URL được chỉ định và nhận redirect_url từ tiêu đề vị trí:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"
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.