У меня тупая проблема, я пытаюсь создать скрипт, который будет копировать связанные таблицы стилей CSS с веб-сайта.
Все работает как положено, но при попытке извлечь css-файлы с корневыми путями, например /cached.php?t=1540425603&f=/styles/theme-base.css
, в начале скрипта у меня есть команда echo, чтобы проверить, что ссылка должна работать
echo file_get_contents('http://php.net/cached.php?t=1539765004&f=/styles/theme-base.css');
и он корректно отображает файл css, но позже в сценарии, пытаясь сделать то же самое, он просто возвращает HTML php.net
вместо css, как это было при запуске сценария.
Ссылка на таблицу стилей после format_url() function
показывает правильный css, если вы вставите его в браузер.
https://php.net/cached.php?t=1540425603&f=/styles/theme-base.css
Поэтому после загрузки DOM с помощью SimpleHTMLDom я перебираю элементы link
, форматирую URL-адреса от относительного к абсолютному с помощью format_url()
и затем сохраняю данные из href в файл на сервере с save_file()
foreach($html->find('link') as $element) {
$name = save_file(format_url($element->href, $og_url), $fol);
$element->href = $name;
}
Возвращается базовое имя файла, поэтому href в html-файле можно изменить на него.
Это просто ошеломляет, я вижу, что URL отображается до file_get_contents()
и ссылка, которая работает, прекрасно работает в браузере и при запуске скрипта, но не здесь.
function save_file($url, $fol) {
echo $url.'<br>';
$file = file_get_contents($url);
$name = pathinfo($url);
$fp = $fol.'/'.$name['basename'];
file_put_contents($fp, $file);
return $name['basename'];
}
Функция format_url форматирует все виды URL, но здесь таблицы стилей - это типы, которые начинаются с корневой папки.
function format_url($url, $page) {
$x = parse_url($page);
$urlX = explode('/', $url);
$name = end($urlX);
if(strpos($url, 'http') === 0) {
} else if(strpos($url, '//') === 0) {
$url = 'https:'.$url;
} else {
// RELATIVE URL
// ROOT FOLDER
if(strpos($url, '/') === 0) {
$url = $x['scheme'].'://'.$x['host'].$url;
} else {
$url = rel2abs($url, $page);
}
}
return $url;
}