2011-12-01 31 views
13

Trong ngày của các trình rút gọn liên kết và Ajax, có thể có nhiều liên kết cuối cùng trỏ đến cùng một nội dung. Tôi đã tự hỏi cách tốt nhất là để có được liên kết cuối cùng, tốt nhất cho một trang web trong PHP, hy vọng với một thư viện. Tôi không thể tìm thấy bất kỳ thứ gì trên Google hoặc GitHub.Làm cách nào để nhận URL cuối cùng, được chuyển hướng, chuẩn của một trang web sử dụng PHP?

Tôi đã thấy mã ví dụ này, nhưng nó không xử lý những thứ như một rel = "kinh điển" thẻ meta hoặc cổng ssl mặc định: http://w-shadow.com/blog/2008/07/05/how-to-get-redirect-url-in-php/

Facebook dường như để xử lý này khá tốt, bạn có thể xem cách họ theo 301 và rel = "kinh điển", vv Để xem ví dụ về cách Facebook xử lý nó, sử dụng công cụ Graph mở của họ:

https://developers.facebook.com/tools/debug

và nhập những liên kết này:

http: // dlvr .it/xxb0W
https://twitter.com/#!/twitter/statuses/136946408275193856

Có một thư viện PHP ra khỏi đó mà đã có này được xây dựng trước, nơi mà nó sẽ kiểm tra các tiêu đề, giải quyết Chuyển hướng 301, phân tích cú pháp rel = "canonical", phát hiện các vòng chuyển hướng và đúng cách chỉ cần lấy URL kết quả tốt nhất để sử dụng?

Thay vào đó, tôi đang mở cho các API có thể được sử dụng, nhưng sẽ thích thứ gì đó chạy trên máy chủ của riêng tôi.

+0

Kiểm tra này, http://stackoverflow.com/questions/4454605/follow-redirects-with-curl -in-php – Srisa

+0

Tôi không biết nếu tôi hiểu câu hỏi của bạn, nhưng tôi nghĩ bạn nên kiểm tra http://php.net/manual/es/reserved.variables.server.php – NotGaeL

+0

Cảm ơn Srisa, đó là tổng quát ý tưởng, nhưng curl không thực hiện theo các chuyển hướng thẻ meta, như các ghi chú trả lời được chấp nhận ... Giải pháp sẽ yêu cầu phân tích cú pháp HTML cho liên kết được chuyển hướng cuối cùng, và sau đó có khả năng chuyển hướng nhiều hơn cho đến khi có vòng lặp hoặc kết thúc chuyển hướng và chuỗi rel = "canonical" ... Ju st hy vọng ai đó đã viết điều này vì vậy tôi không phải. :) – Matt

Trả lời

0

Tôi đã viết cho bạn một chức năng nhỏ để làm điều đó. Nó đơn giản, nhưng nó có thể là một điểm khởi đầu cho bạn. Lưu ý: url http://dlvr.it/xxb0W trả lại URL không hợp lệ cho tiêu đề phản hồi Vị trí của nó.

Bạn sẽ cần thư viện PHP Altumo để nó hoạt động. Đó là một thư viện mà tôi đã viết, nhưng đó là giấy phép MIT, cũng như chức năng này.

Xem: https://github.com/homer6/altumo

Ngoài ra, bạn sẽ phải quấn chức năng trong một try/catch.

/** 
* Gets the final URL of a URL that will be redirected. 
* 
* @param string $url_string 
* @throws \Exception     //on error 
* @return string 
*/ 
function get_final_url($url_string){ 

    while(1){ 

     //validate URL 
      $url = new \Altumo\String\Url($url_string); 

     //get the Location response header of the URL 
      $client = new \Altumo\Http\OutgoingHttpRequest($url_string); 
      $response = $client->sendAndGetResponseMessage(); 
      $location = $response->getHeader('Location'); 

     //return the URL if no Location header was found, else continue 
      if(is_null($location)){ 
       return $url_string; 
      }else{ 
       $url_string = $location; 
      } 

    } 

} 

echo get_final_url('your url here'); 

Vui lòng cho tôi biết nếu bạn muốn sửa đổi thêm hoặc trợ giúp.

+0

Cảm ơn Homer - Tôi đánh giá cao nỗ lực này. Vì tôi không nhận được bất kỳ đề xuất thư viện nào, tôi quyết định bắt đầu viết bài của riêng mình và tôi sẽ đăng nó ở đây (và trên github) khi nó được thực hiện trong vài ngày tới ... Tôi thực sự đang tìm kiếm thứ gì đó tiên tiến hơn sau * chỉ * chuyển hướng tiêu đề vị trí. Tôi muốn nó phân tích cú pháp trang của trang để nhận các URL biểu đồ chuẩn và mở, hãy theo dõi các URL đó, v.v. Thư viện có tối đa khoảng 500 dòng mã cho đến nay, nhưng nó gần như hoạt động như tôi mong muốn. :) – Matt

+0

Âm thanh tốt Matt ... mong được nhìn thấy những gì bạn có. Chúc mừng. – Homer6

12

Vì tôi không thể tìm thấy thư viện nào thực sự làm những gì tôi đang tìm kiếm và tôi hy vọng sẽ làm nhiều hơn là chỉ theo các chuyển hướng HTTP, tôi đã đi trước và tạo một thư viện hoàn thành các mục tiêu và phát hành nó theo giấy phép MIT. Bạn có thể lấy nó ở đây:

https://github.com/mattwright/URLResolver.php

URLResolver.php là một lớp học PHP mà cố gắng để giải quyết URL đến một trận chung kết, liên kết kinh điển:

  • Làm theo 301 và 302 chuyển hướng tìm thấy trong tiêu đề HTTP
  • Làm theo mở Graph URL <meta> thẻ tìm thấy trong trang web < đầu >
  • Làm theo URL Canonical < liên kết > thẻ tìm thấy trong trang web < đầu >
  • hủy bỏ tải qu ickly nếu loại nội dung không phải là trang HTML

Tôi chắc chắn không phải là chuyên gia về quy tắc chuyển hướng HTTP, vì vậy nếu có ai có đề xuất về cách cải thiện thư viện này, nó sẽ được đánh giá cao. Tôi đã thử nghiệm trên hàng nghìn URL và dường như nó hoạt động khá tốt. Tôi theo lời khuyên của Mario và sử dụng thư viện PHP Parser HTML đơn giản khi cần thiết.

+2

hữu ích như người đàn ông địa ngục, nhờ –

+0

Điều này hoạt động thực sự tốt. –

2

Sử dụng hay uống rượu (một nổi tiếng và mạnh mẽ HTTP client), bạn có thể làm điều đó như thế:

<?php 
use Guzzle\Http\Client as GuzzleClient; 
use Guzzle\Plugin\History\HistoryPlugin; 

public function resolveUrl($url) 
{ 
    $client = new GuzzleClient($url); 
    $history = new HistoryPlugin(); 
    $client->addSubscriber($history); 

    $response = $client->head($url)->send(); 

    if (!$response->isSuccessful()) { 
     throw new \Exception(sprintf("Url %s is not a valid URL or website is down.", $url)); 
    } 

    return $response->getEffectiveUrl(); 
} 
Các vấn đề liên quan