конвертировать относительные ссылки в абсолютные URL

Это для веб-сканера в PHP. По сути, учитывая базовый URL и относительную ссылку, мне нужно вернуть фактический / абсолютный URL полученной ссылки.

Пример:
Базовый URL: http://www.somewebsite.com/files/page.html
Ссылка: ../index.php

Результат: http://somewebsite.com/index.php

Есть ли библиотека, которая делает это, или способ кодировать это вручную?

-1

Решение

Эта функция будет разрешить относительные URL к дано URL текущей страницы в $pgurl без регулярных выражений. Это успешно решает:

/home.php?example типы,

то же самое, реж nextpage.php типы,

../...../.../parentdir типы,

полный http://example.net URLs,

и стенография //example.net URLs

//Current base URL (you can dynamically retrieve from $_SERVER)
$pgurl = 'http://example.com/scripts/php/absurl.php';

function absurl($url) {
global $pgurl;
if(strpos($url,'://')) return $url; //already absolute
if(substr($url,0,2)=='//') return 'http:'.$url; //shorthand scheme
if($url[0]=='/') return parse_url($pgurl,PHP_URL_SCHEME).'://'.parse_url($pgurl,PHP_URL_HOST).$url; //just add domain
if(strpos($pgurl,'/',9)===false) $pgurl .= '/'; //add slash to domain if needed
return substr($pgurl,0,strrpos($pgurl,'/')+1).$url; //for relative links, gets current directory and appends new filename
}

function nodots($path) { //Resolve dot dot slashes, no regex!
$arr1 = explode('/',$path);
$arr2 = array();
foreach($arr1 as $seg) {
switch($seg) {
case '.':
break;
case '..':
array_pop($arr2);
break;
case '...':
array_pop($arr2); array_pop($arr2);
break;
case '....':
array_pop($arr2); array_pop($arr2); array_pop($arr2);
break;
case '.....':
array_pop($arr2); array_pop($arr2); array_pop($arr2); array_pop($arr2);
break;
default:
$arr2[] = $seg;
}
}
return implode('/',$arr2);
}

Пример использования:

echo nodots(absurl('../index.html'));

nodots() должен быть назван после URL-адрес преобразуется в абсолютный.

Функция многоточия отчасти избыточна, но является читаемой, быстрой, не использует регулярные выражения и разрешит 99% типичных URL-адресов (если вы хотите быть на 100% уверенными, просто расширьте блок переключателя, чтобы поддерживать более 6 точек, хотя Я никогда не видел столько точек в URL).

Надеюсь это поможет,

2

Другие решения

.htaccess и регулярные выражения могут сделать свое дело. Подобное обсуждение найдено: Перенаправить URL на пользовательский URL через .htaccess

0

По вопросам рекламы [email protected]