
Относительный путь в HTML вычисляется от базового URL документа, поэтому после переноса страницы тот же адрес ресурса может указывать на другой каталог. Сначала проверьте итоговый URL страницы и запросы ресурсов в инструментах разработчика, ничего не меняя на продакшене. Затем исправьте базовый путь или ссылки, проверьте сборку и подготовьте откат.
Что меняется в маршрутах к ресурсам после переноса страницы
- Путь без начального слеша обычно разрешается относительно URL текущей страницы, а не корня сайта.
- После смены каталога браузер может запрашивать CSS, скрипты, изображения или шрифты по новому адресу.
- Начальный слеш в пути меняет правило: адрес отсчитывается от корня сайта.
- Одинаковое поведение локально и на опубликованном сайте не гарантировано: могут различаться базовый URL, маршрутизация и регистр символов.
Как браузер разрешает относительный путь от адреса HTML-файла
Браузер разрешает относительную ссылку относительно базового URL документа. Обычно это адрес страницы; однако элемент <base href="..."> в HTML может задать другой базовый адрес. Поэтому при поиске причины сравнивайте не только исходный текст ссылки, но и фактический запрос в браузере.
Например, если страница открыта по адресу https://example.com/catalog/item/, ссылка images/photo.jpg обычно ведёт к https://example.com/catalog/item/images/photo.jpg. После переноса страницы на /item/ тот же путь даст другой URL.
- Что видит пользователь: изображение не появляется, стили не применяются или страница работает без скрипта.
- В панели Network запрос ресурса завершается ошибкой либо возвращает неожиданный ответ.
- Ссылка открывается на старой странице, но перестаёт работать после перехода на новый адрес.
Чтобы понять, как указать путь к файлу в HTML, сначала определите адрес документа и базовый URL, а затем вычислите, куда браузер разрешает ссылку.
Почему ./, ../ и корневой / ведут к разным файлам
Проведите быструю диагностику в режиме чтения: откройте опубликованную страницу, изучите HTML и сетевые запросы, не редактируя файлы и настройки сервера.
- Скопируйте полный URL страницы из адресной строки.
- Найдите проблемный путь в HTML или в стилях и зафиксируйте его написание.
- Проверьте наличие элемента
<base>: он меняет базу для относительных ссылок. - Вычислите итоговый URL:
./относится к текущему каталогу,../поднимается на уровень выше. - Учтите, что путь с начальным
/отсчитывается от корня домена, а не от текущего каталога. - В инструментах разработчика откройте Network и проверьте фактический URL, код ответа и тип содержимого.
- Сверьте регистр букв и расширение: на сервере имена файлов могут различаться по регистру.
- Сравните результат локальной сборки с опубликованной версией: проверьте настройки base URL и правила маршрутизации.
Понятия абсолютные и относительные пути важно не смешивать: абсолютный URL с протоколом и доменом задаёт полный адрес ресурса, а путь с начальным слешем задаёт адрес от корня сайта. Относительная ссылка зависит от базы документа или элемента <base>.
Таблица диагностики: исходный путь, новый URL и ожидаемый ресурс
В примерах страница доступна по адресу https://example.com/catalog/item/index.html. Ожидаемый итог может измениться, если на странице задан другой базовый URL.
| Симптом | Возможные причины | Как проверить | Как исправить |
|---|---|---|---|
Ссылка img/photo.jpg не находит изображение после переноса |
Относительный путь теперь разрешается от нового каталога страницы | Проверьте Request URL в Network. Для указанного примера ожидаемый адрес - https://example.com/catalog/item/img/photo.jpg |
Исправьте путь относительно нового каталога или используйте согласованный путь от корня сайта |
| Ресурс загружается из соседнего каталога | ../ поднял адрес на уровень выше |
Сопоставьте URL страницы и итоговый URL запроса. Для ../img/photo.jpg ожидается https://example.com/catalog/img/photo.jpg |
Уточните число переходов вверх либо задайте путь от корня сайта, если это соответствует структуре проекта |
Путь с /img/photo.jpg работает в корне, но не на вложенном сайте |
Начальный слеш ведёт от корня домена, а проект опубликован в подпапке | Проверьте фактический URL запроса и настройки базового пути сборки | Настройте пути с учётом каталога публикации и пересоберите проект |
| Локально файл открывается, на сервере возвращается 404 | Различается регистр имени или путь ссылается на отсутствующий файл | Сравните имя в запросе с именем файла в опубликованной сборке, включая регистр и расширение | Исправьте ссылку или имя файла в проекте, затем проверьте новую сборку |
| Вместо CSS, скрипта или изображения приходит HTML-страница | Маршрутизатор перенаправил запрос на страницу приложения, либо сервер обрабатывает путь как маршрут | Проверьте статус, заголовок Content-Type и тело ответа в Network | Исправьте адрес ресурса или настройку маршрутизации; проверьте результат на тестовой среде |
| Все относительные ссылки ведут не туда | На странице задан неподходящий <base href> |
Найдите элемент <base> в HTML и проверьте его значение |
Согласуйте базовый URL с маршрутом страницы и повторно проверьте ресурсы |
Как найти сломанные ссылки на CSS, скрипты, изображения и шрифты
- Зафиксируйте исходное состояние. Сохраните URL страницы и скриншот сетевых ошибок; пока не меняйте продакшен.
- Откройте инструменты разработчика. Вкладка Network покажет адрес запроса, статус и тип ответа. Включите фильтры CSS, JS, Img или Font по необходимости.
- Проверьте конкретный запрос. Сопоставьте Request URL с расположением файла в сборке. Так выясняется, почему не отображаются изображения на сайте или не применяются стили.
- Проверьте HTML и CSS. Найдите ссылки в атрибутах
src,href, в CSS-правилеurl(...)и значение элемента<base>. - Сравните окружения. Проверьте локальную сборку и тестовую публикацию: базовый путь проекта, каталог размещения и правила маршрутизации могут различаться.
- Сверьте имена файлов. Проверьте регистр букв, расширение и фактическое наличие файла в артефактах сборки.
- Исправьте один тип ссылок и протестируйте. Внесите изменение в исходники или конфигурацию, соберите проект и проверьте результат на тестовой среде.
- Публикуйте после проверки. Сверьте запросы ресурсов на целевой странице и убедитесь, что остальные маршруты не пострадали.
Безопасный перенос страницы: проверка путей до и после публикации
Сначала проверьте проблему без изменений на продакшене. Перенос выполняйте через контроль версий и тестовую среду, сохраняя прежний маршрут и сборку до завершения проверки.
- До переноса запишите старый и новый URL страницы и перечислите связанные ресурсы.
- Проверьте локальную сборку и конфигурацию базового URL для каталога публикации.
- На тестовой среде проверьте CSS, скрипты, изображения и шрифты в Network.
- После публикации проверьте саму страницу, вложенные маршруты и переходы по внутренним ссылкам.
- Держите прежнюю версию и маршрут доступными для быстрого возврата, если это допускают правила проекта.
Обратитесь к специалисту или поддержке хостинга, если правильный URL ресурса возвращает ошибку сервера, маршрутизатор перехватывает запросы к статическим файлам, конфигурация публикации недоступна либо ошибка затрагивает несколько страниц. Не меняйте правила сервера вслепую: сначала подтвердите проблему на тестовой среде.
Как откатить перенос и восстановить прежнюю структуру без потери изменений
Перед эскалацией выполните короткий план отката, не удаляя новые файлы и не перезаписывая чужие изменения.
- Остановите дальнейшие публикации, если после последнего переноса появились новые ошибки.
- Сохраните логи запросов, список проблемных URL и текущий номер версии или коммита.
- Сверьте изменения с контрольной версией и определите, какие файлы и настройки относятся именно к переносу.
- Верните прежний маршрут или предыдущую проверенную сборку штатным способом деплоя.
- Если откат должен сохранить часть новых изменений, отделите их в отдельную ветку или коммит до возврата версии.
- Проверьте прежний адрес, ресурсы и основные маршруты после отката.
- Зафиксируйте результат и только затем передайте специалисту сведения о запросах и изменениях.
- Храните изменения в системе контроля версий и не правьте опубликованные файлы вручную.
- Перед переносом записывайте исходный и целевой URL страницы.
- Для проекта в подпапке проверяйте базовый путь сборки на тестовой среде.
- Проверяйте регистр имён и наличие ресурсов в итоговых артефактах.
- Сохраняйте проверенную сборку и понятный способ возврата к ней.
Разбор нестандартных случаев с путями после переезда страницы
Почему путь работает при открытии файла локально, но не на сайте?
Локальная среда и сервер могут по-разному обрабатывать регистр имён и базовый каталог. Сравните опубликованный URL запроса с расположением файла в итоговой сборке.
Что меняет элемент <base> в HTML?
Он задаёт базовый URL для разрешения относительных ссылок документа. Если значение не соответствует новому маршруту, несколько ресурсов могут одновременно начать загружаться по неверным адресам.
Когда использовать путь с начальным слешем?
Он указывает путь от корня домена, например /assets/site.css. Если сайт размещён в подпапке домена, такая ссылка может обойти каталог публикации.
Почему сервер возвращает страницу приложения вместо файла?
Правило маршрутизации могло обработать запрос к ресурсу как маршрут приложения. Проверьте URL, статус и Content-Type ответа, затем изучите настройки сервера или маршрутизатора.
Нужно ли заменять все относительные пути после переноса?
Нет. Сначала определите, какие ссылки действительно разрешаются неправильно и почему. Массовая замена может сломать другие маршруты или размещение сайта в подпапке.
Что проверить, если путь верный, а изображение не показывается?
Проверьте ответ сервера, Content-Type, регистр имени, расширение и наличие файла в опубликованной сборке. Убедитесь также, что браузер не использует устаревшую версию страницы или ресурса.
Можно ли безопасно проверить исправление без публикации на продакшене?
Да: соберите проект локально или разверните его на тестовой среде с тем же базовым путём. Проверьте фактические запросы ресурсов до публикации.
Автор: Сергей Макаров.