PHP и Laravel
Laravel: файл загружен, но ссылка storage возвращает 404
Laravel сохраняет файл, но ссылка через storage возвращает 404. Разберём разницу между местом хранения и публичным адресом загрузки.
Что происходит и с чего начать
Успешная запись файла и доступ к нему по ссылке — разные части сценария. Приложение может сохранить данные на одном диске или пути, а URL сформировать для другого. Публичное хранилище также требует предусмотренной связи с веб-каталогом. Поэтому сначала найдите фактический файл и сравните его путь с ожидаемой ссылкой. Не делайте всё хранилище общедоступным ради проверки: некоторые документы должны выдаваться только авторизованному пользователю, и их отсутствие по прямому URL может быть правильным ограничением.
Что можно проверить самостоятельно
- Сохраните пример новой загрузки и её URL. Уточните, должен ли файл быть публичным или доступным только владельцу, чтобы не принять ограничение доступа за неисправность.
- Проверьте, открываются ли старые файлы и отличается ли поведение после новой загрузки. Запишите изменения домена, диска или конфигурации хранения при последней публикации.
- Попросите сверить фактический путь файла и настроенный диск. Не создавайте вручную множество копий в публичной папке: это скрывает проблему и усложняет последующее удаление документов.
Как понять результаты проверки
Специалист проверяет настройки файловой системы, сформированный адрес, ссылку между каталогами и конфигурацию веб-сервера. В контейнерной установке важна видимость общего тома для процесса записи и процесса отдачи. Файл может существовать для одного, но отсутствовать для другого. Если используется внешнее хранилище, проверяются его адреса и правила доступа. Правильное решение сохраняет назначение диска: публичные изображения доступны по ожидаемому URL, а приватные документы проходят предусмотренную проверку полномочий перед выдачей.
Что проверяет разработчик
Для этой части понадобятся доступ к настройкам, журналам ошибок или коду. Её можно передать специалисту вместе с результатами предыдущих шагов.
- Найдите файл в фактическом хранилище и сверьте путь, сохранённый приложением. Локальный private-диск не должен автоматически становиться публичным.
- Для публичного локального диска проверьте символическую ссылку и её цель. После переключения релиза ссылка может указывать на старую папку.
- Сверьте корень веб-сервера, базовый URL и права чтения. Если используется объектное хранилище, проверяйте его настройки доступа и формирование URL отдельно.
На что обратить внимание
Команда создания ссылки не переносит файлы между дисками. Если загрузка записывает в одно место, а шаблон строит URL для другого, повторное создание ссылки не решит проблему.
Как исправляют причину
Согласуйте диск и способ выдачи URL. Публичными делайте только предназначенные для этого файлы; закрытые вложения выдавайте через авторизованный обработчик или предусмотренные временные ссылки.
Как убедиться, что проблема решена
Загрузите новое изображение и проверьте его после следующего переключения релиза. Отдельно убедитесь, что закрытое вложение не стало доступным по угадываемому адресу.
После исправления загрузите новый файл, откройте старый и проверьте удаление, если оно предусмотрено. Затем повторите публикацию на тестовом окружении: связь каталогов не должна теряться при каждом релизе. Для закрытых документов проверьте доступ другим пользователем. Приёмка должна подтверждать одновременно доступность нужного файла и отсутствие случайного раскрытия всего содержимого хранилища по прямым ссылкам.