Changeset 99385 in spip-zone


Ignore:
Timestamp:
Sep 5, 2016, 10:10:13 AM (3 years ago)
Author:
kent1@…
Message:
  • Si plusieurs redirections successives, il se peut que l'entête Location montre un path local, on récupère donc le domaine
  • Bien supprimer Location:, location: et content-location des urls de redirection
  • Si la redirection mène sur notre site, afficher les liens internes en redirection, du coup on décode l'url avec inc/urls
File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/linkcheck/trunk/inc/linkcheck_fcts.php

    r99354 r99385  
    184184                        $ret['etat'] = isset($tabStatus[0][$status[0][0]]) ? $tabStatus[0][$status[0][0]] : 'malade';
    185185                        $ret['code'] = $status[0];
     186                        $redirections = array();
     187                        $codes = array();
    186188                        if (is_array($head) && $ret['etat'] == 'deplace') {
    187189                                foreach ($head as $line) {
    188190                                        if (preg_match('/Location/Uims', $line, $matches)) {
    189                                                 $ret['redirection'] = trim(str_replace('Location:', '', $line));
     191                                                $redirections[] = parametre_url(parametre_url(parametre_url(trim(str_replace(array('Content-location:', 'content-location:', 'Location:', 'location:'), '', $line)), 'utm_source', ''), 'utm_medium', ''), 'utm_campaign', '');
    190192                                        }
    191                                         if (preg_match('/HTTP\/1.1 (404)/Uims', $line, $status)) {
     193                                        if (preg_match('/HTTP\/1\.1 (404)/Uims', $line, $status)) {
    192194                                                $ret['etat'] = 'mort';
    193195                                                $ret['code'] = $status[1];
     
    195197                                        }
    196198                                }
     199                                $redirections = array_reverse($redirections);
     200                                foreach ($redirections as $redirection) {
     201                                        $end_redirection = '';
     202                                        if (strpos($redirection, 'http://') === false && strpos($redirection, 'https://') === false) {
     203                                                $end_redirection = $redirection;
     204                                        } else {
     205                                                $url_finale = parse_url($redirection);
     206                                                if (strlen($end_redirection) > 0) {
     207                                                        $redirection = str_replace($url_finale['query'], '', str_replace($url_finale['path'], '', $redirection));
     208                                                }
     209                                                $ret['redirection'] = rtrim($redirection,'/').'/'.$end_redirection;
     210                                                $domaine = rtrim(str_replace($url_finale['query'], '', str_replace($url_finale['path'], '', $ret['redirection'])),'?');
     211                                                /**
     212                                                 * Cas où c'est une redirection chez nous depuis un site externe (bit.ly...)
     213                                                 */
     214                                                if (str_replace(array('https://', 'http://', '//'), '', rtrim($domaine,'/')) == str_replace(array('https://', 'http://', '//'), '', rtrim($GLOBALS['meta']['adresse_site'],'/'))) {
     215                                                        $redir_chez_nous = str_replace($domaine,'',$ret['redirection']);
     216                                                        include_spip('inc/urls');
     217                                                        $url_dans_site = urls_decoder_url($redir_chez_nous);
     218                                                        if (is_array($url_dans_site) && isset($url_dans_site[0])) {
     219                                                                $ret['redirection'] = $url_dans_site[0].$url_dans_site[1][id_table_objet($url_dans_site[0])];
     220                                                        }
     221                                                }
     222                                                break;
     223                                        }
     224                                        /**
     225                                         * Si pas de redirection ou la redirection n'a pas de http... et que l'on a un end_redirection
     226                                         */
     227                                        if ((!isset($ret['redirection']) OR strpos($ret['redirection'], '//') === false) && strlen($end_redirection) > 0) {
     228                                                $url_finale = parse_url($url);
     229                                                $domaine = rtrim(str_replace($url_finale['query'], '', str_replace((($url_finale['path'] == '/') ? '' : $url_finale['path']), '', $url)),'?');
     230                                                $domaine = rtrim($domaine, '/');
     231                                                /**
     232                                                 * Soit on est sur notre propre domaine et dans ce cas on essaie de retrouver l'url de l'objet si possible
     233                                                 * pour faire un lien interne
     234                                                 * Sinon on récupère le domaine de l'url d'origine
     235                                                 */
     236                                                if (str_replace(array('https://', 'http://', '//'), '', $domaine) == rtrim(str_replace(array('https://', 'http://', '//'), '', $GLOBALS['meta']['adresse_site']), '/')) {
     237                                                        include_spip('inc/urls');
     238                                                        $url_dans_site = urls_decoder_url($end_redirection);
     239                                                        if (is_array($url_dans_site) && isset($url_dans_site[0])) {
     240                                                                $ret['redirection'] = $url_dans_site[0].$url_dans_site[1][id_table_objet($url_dans_site[0])];
     241                                                        } else {
     242                                                                $ret['redirection'] = $domaine.'/'.ltrim($end_redirection,'/');
     243                                                        }
     244                                                } else {
     245                                                        $ret['redirection'] = $domaine.'/'.ltrim($end_redirection,'/');
     246                                                }
     247                                        }
     248                                }
    197249                        }
    198250                }
     
    203255                }
    204256        }
    205 
    206257        return $ret;
    207258}
Note: See TracChangeset for help on using the changeset viewer.