Я думаю, что самый простой способ сделать это - внедрить тег base
с атрибутом href
, установленным в базовый URL последнего эффективного URL (URL, который в конечном итоге был выбран cURL в случае возможных перенаправлений) , Этот последний эффективный URL-адрес может быть получен с помощью cURL с помощью:
$url = curl_getinfo( $ch, CURLINFO_EFFECTIVE_URL );
В этом ответе я объяснил, как установить базовый тег с DOMDocument . Он также учитывает ситуации, когда уже есть тег base
. Хотя по общему признанию, мой пример еще не ищет наличие атрибута href
в теге base
. Добавление этой проверки должно быть тривиальным путем использования DOMElement::hasAttribute()
.
редактировать
В ответ на комментарий alex2005:
Вы можете немного изменить его и сделать это:
$baseElement = $doc->createElement( 'base' );
$baseElement->setAttribute( 'href', $url );
$headElement = $doc->getElementsByTagName( 'head' )->item( 0 );
// it will automatically append, if $headElement has no firstChild (i.e. is null)
$headElement->insertBefore( $baseElement, $headElement->firstChild );
редактировать 2
Небольшое предупреждение, хотя. Я что-то упустил.
$url = curl_getinfo( $ch, CURLINFO_EFFECTIVE_URL );
... может эффективно возвращать URL, например:
http://example.com/some/path/to/a/file.html
Я не уверен, как браузеры обрабатывают имена файлов в тегах base
. Я предполагаю, что они извлекают путь к каталогу. Но не уверен насчет этого.
Но кроме этого возможного предостережения, в большинстве случаев вам, вероятно, нужно иметь только доменное имя последнего перенаправленного URL, которое будет использоваться в базовом теге.
По крайней мере, это верно для разрешения абсолютных URI, таких как
/css/some.css
/js/some.js
/some/file.html
Для разрешения относительных URI, таких как:
css/some.css
js/some.js
some/file.html
... возможно, вы также захотите извлечь часть каталога из URL:
http://example.com/some/path/to/a/
Итак, после того, как он немного подумает, вероятно, не так уж и легко объяснить все возможные сценарии. Помните об этом.