{"id":231562,"date":"2022-12-24T17:43:00","date_gmt":"2022-12-24T14:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231562"},"modified":"2022-12-07T11:02:13","modified_gmt":"2022-12-07T08:02:13","slug":"encontrando-o-destino-de-um-redirecionamento-com-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/encontrando-o-destino-de-um-redirecionamento-com-php\/","title":{"rendered":"Encontrando o destino de um redirecionamento com PHP"},"content":{"rendered":"\n<p>Recentemente, eu estava trabalhando em um projeto que estava se comunicando com uma API de terceiros que, como muitas APIs, envia de volta muitos dados, parte dos quais inclui uma URL para o produto associado \u00e0 API.<\/p>\n<p>A coisa sobre a API que estava sendo retornada n\u00e3o era o URL de destino adequado. Em vez disso, era um URL que redirecionava para outro URL.<\/p>\n<p>Ent\u00e3o imagine acessar, digamos, <strong>acme.site-info.com<\/strong> e t\u00ea-lo direto para <strong>acme.com<\/strong>. Fazemos isso manualmente o tempo todo, mas eu precisava obter o destino real \u2013 ou final \u2013 do direto da URL.<\/p>\n<p>E encontrar o destino de um redirecionamento com PHP \u00e9 f\u00e1cil; no entanto, isso pressup\u00f5e que h\u00e1 apenas um \u00fanico redirecionamento.<\/p>\n<p>No entanto, aqui est\u00e1 como faz\u00ea-lo.<\/p>\n<p>Observe que a suposi\u00e7\u00e3o a seguir pressup\u00f5e que voc\u00ea esteja familiarizado com <a href=\"https:\/\/curl.haxx.se\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cURL<\/a>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160277-61e708790bd4a.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160277-61e708790bd4a.png\" alt=\"Encontrando o destino de um redirecionamento com PHP\" ><\/a><\/p>\n<p>E se n\u00e3o, \u00e9 f\u00e1cil usar a fun\u00e7\u00e3o.<\/p>\n<blockquote>\n<p>curl \u00e9 usado em linhas de comando ou scripts para transferir dados. Tamb\u00e9m \u00e9 usado em carros, televisores, roteadores, impressoras, equipamentos de \u00e1udio, telefones celulares, tablets, decodificadores, reprodutores de m\u00eddia e \u00e9 a espinha dorsal de transfer\u00eancia da Internet para milhares de aplicativos de software que afetam bilh\u00f5es de humanos diariamente.<\/p>\n<\/blockquote>\n<p>Al\u00e9m disso, o manual do PHP tem muitas informa\u00e7\u00f5es sobre ele <a href=\"https:\/\/www.php.net\/manual\/en\/book.curl.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">que voc\u00ea pode ler<\/a> conforme necess\u00e1rio (e provavelmente tamb\u00e9m precisar\u00e1 delas no futuro).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160277-61e7087de6a45.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160277-61e7087de6a45.png\" alt=\"Encontrando o destino de um redirecionamento com PHP\" ><\/a><\/p>\n<p>De qualquer forma, aqui est\u00e1 o c\u00f3digo com um pouco de explica\u00e7\u00e3o sobre <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1e9882520588a5d8ee8948050ce48d69\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ap\u00f3s o c\u00f3digo<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Determines the destination URL of a provided URL that gives a redirect.\n *\n * @param string $url the specified URL provided by the API.\n * @return string $url the destination of the specified URL.\n *\/\nprivate function getDestinationUrl($url)\n{\n  $ch = curl_init();\n\n  curl_setopt($ch, CURLOPT_URL, $url);\n  curl_setopt($ch, CURLOPT_HEADER, true);\n  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);\n  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n\n  \/\/ Read the headers as provided by cURL.\n  $headers = curl_exec($ch);\n  $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);\n\n  \/\/ We only need the domain so just read the first part.\n  $url = explode('\/', $url);\n  $url = $url[0];\n\n  return $url;\n}<\/code><\/pre>\n<p>A fun\u00e7\u00e3o faz o seguinte:<\/p>\n<ol>\n<li>aceita o URL conforme fornecido pela API,<\/li>\n<li>recupera os cabe\u00e7alhos da solicita\u00e7\u00e3o para a URL por cURL,<\/li>\n<li>fornece os cabe\u00e7alhos que podemos ler e pegar a URL<\/li>\n<\/ol>\n<p>Observe tamb\u00e9m que eu separo a URL com base na barra para que eu possa ler apenas o dom\u00ednio, pois n\u00e3o estou preocupado com nada ap\u00f3s o dom\u00ednio principal (portanto, se um dom\u00ednio tiver uma extens\u00e3o <strong>index<\/strong> <strong>.php ,<\/strong> <strong>default.<em><\/em><\/strong> aspx <em><\/em> extens\u00e3o, etc.), ent\u00e3o eu posso us\u00e1-lo conforme necess\u00e1rio em meu trabalho.<\/p>\n<p>Em segundo lugar, observe que n\u00e3o sei se isso funcionar\u00e1 para mais de um salto. Portanto, se voc\u00ea tiver v\u00e1rios redirecionamentos, poder\u00e1 repetir essa fun\u00e7\u00e3o v\u00e1rias vezes. N\u00e3o sei, mas achei que valia a pena mencionar.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta solu\u00e7\u00e3o para encontrar o destino de um redirecionamento com PHP \u00e9 f\u00e1cil, mas pressup\u00f5e um \u00fanico redirecionamento.<\/p>\n","protected":false},"author":1,"featured_media":235285,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,806],"tags":[1170],"class_list":["post-231562","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-php-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=231562"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231562\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/235285"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}