Описать проблему ↗

PHP и Laravel

Laravel: файл загружен, но ссылка storage возвращает 404

Laravel сохраняет файл, но ссылка через storage возвращает 404. Разберём разницу между местом хранения и публичным адресом загрузки.

Редакция «починимсайт» · Обновлено · 3 мин. чтения

Что происходит и с чего начать

Успешная запись файла и доступ к нему по ссылке — разные части сценария. Приложение может сохранить данные на одном диске или пути, а URL сформировать для другого. Публичное хранилище также требует предусмотренной связи с веб-каталогом. Поэтому сначала найдите фактический файл и сравните его путь с ожидаемой ссылкой. Не делайте всё хранилище общедоступным ради проверки: некоторые документы должны выдаваться только авторизованному пользователю, и их отсутствие по прямому URL может быть правильным ограничением.

Что можно проверить самостоятельно

  1. Сохраните пример новой загрузки и её URL. Уточните, должен ли файл быть публичным или доступным только владельцу, чтобы не принять ограничение доступа за неисправность.
  2. Проверьте, открываются ли старые файлы и отличается ли поведение после новой загрузки. Запишите изменения домена, диска или конфигурации хранения при последней публикации.
  3. Попросите сверить фактический путь файла и настроенный диск. Не создавайте вручную множество копий в публичной папке: это скрывает проблему и усложняет последующее удаление документов.

Как понять результаты проверки

Специалист проверяет настройки файловой системы, сформированный адрес, ссылку между каталогами и конфигурацию веб-сервера. В контейнерной установке важна видимость общего тома для процесса записи и процесса отдачи. Файл может существовать для одного, но отсутствовать для другого. Если используется внешнее хранилище, проверяются его адреса и правила доступа. Правильное решение сохраняет назначение диска: публичные изображения доступны по ожидаемому URL, а приватные документы проходят предусмотренную проверку полномочий перед выдачей.

Что проверяет разработчик

Для этой части понадобятся доступ к настройкам, журналам ошибок или коду. Её можно передать специалисту вместе с результатами предыдущих шагов.

  1. Найдите файл в фактическом хранилище и сверьте путь, сохранённый приложением. Локальный private-диск не должен автоматически становиться публичным.
  2. Для публичного локального диска проверьте символическую ссылку и её цель. После переключения релиза ссылка может указывать на старую папку.
  3. Сверьте корень веб-сервера, базовый URL и права чтения. Если используется объектное хранилище, проверяйте его настройки доступа и формирование URL отдельно.

На что обратить внимание

Команда создания ссылки не переносит файлы между дисками. Если загрузка записывает в одно место, а шаблон строит URL для другого, повторное создание ссылки не решит проблему.

Как исправляют причину

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

Как убедиться, что проблема решена

Загрузите новое изображение и проверьте его после следующего переключения релиза. Отдельно убедитесь, что закрытое вложение не стало доступным по угадываемому адресу.

После исправления загрузите новый файл, откройте старый и проверьте удаление, если оно предусмотрено. Затем повторите публикацию на тестовом окружении: связь каталогов не должна теряться при каждом релизе. Для закрытых документов проверьте доступ другим пользователем. Приёмка должна подтверждать одновременно доступность нужного файла и отсутствие случайного раскрытия всего содержимого хранилища по прямым ссылкам.