Looking for URL redirects with HTTP headers and curls?

I am trying to code a redirect check to see if the URL is search engine friendly. He should check if the URL is redirected or not, and if it is redirected, he must indicate whether he is SEO friendly (status code 301) or not (302/304).

Here's something similar I found: http://www.webconfs.com/redirect-check.php

It should also be able to track multiple redirects (e.g. A to B to C) and tell me that A is redirecting to C.

This is what I got so far, but it does not work completely correctly (example: when entering on www.example.com it does not find a redirect to www.example.com/page1)

<?php // You can edit the messages of the respective code over here $httpcode = array(); $httpcode["200"] = "Ok"; $httpcode["201"] = "Created"; $httpcode["302"] = "Found"; $httpcode["301"] = "Moved Permanently"; $httpcode["304"] = "Not Modified"; $httpcode["400"] = "Bad Request"; if(count($_POST)>0) { $url = $_POST["url"]; $curlurl = "http://".$url."/"; $ch = curl_init(); // Set URL to download curl_setopt($ch, CURLOPT_URL, $curlurl); // User agent curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]); // Include header in result? (0 = yes, 1 = no) curl_setopt($ch, CURLOPT_HEADER, 0); // Should cURL return or print out the data? (true = return, false = print) curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Timeout in seconds curl_setopt($ch, CURLOPT_TIMEOUT, 15); // Download the given URL, and return output $output = curl_exec($ch); $curlinfo = curl_getinfo($ch); if(($curlinfo["http_code"]=="301") || ($curlinfo["http_code"]=="302")) { $ch = curl_init(); // Set URL to download curl_setopt($ch, CURLOPT_URL, $curlurl); // User agent curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]); // Include header in result? (0 = yes, 1 = no) curl_setopt($ch, CURLOPT_HEADER, 0); // Should cURL return or print out the data? (true = return, false = print) curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Timeout in seconds curl_setopt($ch, CURLOPT_TIMEOUT, 15); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Download the given URL, and return output $output = curl_exec($ch); $curlinfo = curl_getinfo($ch); echo $url." is redirected to ".$curlinfo["url"]; } else { echo $url." is not getting redirected"; } // Close the cURL resource, and free system resources curl_close($ch); } ?> <form action="" method="post"> http://<input type="text" name="url" size="30" />/ <b>eg www.google.com</b><br/> <input type="submit" value="Submit" /> </form> 
+6
source share
1 answer

Well, if you want to record every call forwarding, you must implement it yourself and turn off the automatic “next location”:

 function curl_trace_redirects($url, $timeout = 15) { $result = array(); $ch = curl_init(); $trace = true; $currentUrl = $url; $urlHist = array(); while($trace && $timeout > 0 && !isset($urlHist[$currentUrl])) { $urlHist[$currentUrl] = true; curl_setopt($ch, CURLOPT_URL, $currentUrl); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); $output = curl_exec($ch); if($output === false) { $traceItem = array( 'errorno' => curl_errno($ch), 'error' => curl_error($ch), ); $trace = false; } else { $curlinfo = curl_getinfo($ch); if(isset($curlinfo['total_time'])) { $timeout -= $curlinfo['total_time']; } if(!isset($curlinfo['redirect_url'])) { $curlinfo['redirect_url'] = get_redirect_url($output); } if(!empty($curlinfo['redirect_url'])) { $currentUrl = $curlinfo['redirect_url']; } else { $trace = false; } $traceItem = $curlinfo; } $result[] = $traceItem; } if($timeout < 0) { $result[] = array('timeout' => $timeout); } curl_close($ch); return $result; } // apparently 'redirect_url' is not available on all curl-versions // so we fetch the location header ourselves function get_redirect_url($header) { if(preg_match('/^Location:\s+(.*)$/mi', $header, $m)) { return trim($m[1]); } return ""; } 

And you use it like this:

 $res = curl_trace_redirects("http://www.example.com"); foreach($res as $item) { if(isset($item['timeout'])) { echo "Timeout reached!\n"; } else if(isset($item['error'])) { echo "error: ", $item['error'], "\n"; } else { echo $item['url']; if(!empty($item['redirect_url'])) { // redirection echo " -> (", $item['http_code'], ")"; } echo "\n"; } } 

It is possible that my code is not fully thought out, but I think this is a good start.

Edit

Here are some examples:

 http://midas/~stefan/test/redirect/fritzli.html -> (302) http://midas/~stefan/test/redirect/hansli.html -> (301) http://midas/~stefan/test/redirect/heiri.html 
+7
source

Source: https://habr.com/ru/post/903904/


All Articles