Как запретить доступ к папке через url?

Мне нужно запретить доступ к папке public через url, как это сделать?
  • Вопрос задан
  • 564 просмотра
Решения вопроса 1
delphinpro
@delphinpro Куратор тега Laravel
frontend developer
Другое дело.
Чтобы файлы не были доступны по ссылке, не нужно их размещать в публичной директории.
Я делал так:

Регистрируем маршрут

Route::get('p/attach/{id}', [AttachmentController::class, 'show'])
  ->name('attachment.show')
  ->middleware(['auth']);


Маршрут закрыт аутентификацией, только зарегистрированные пользователи могут получить доступ. Но вы можете любые другие условия организовать.

Регистрируем приватный диск
// config/filesystem.php
    'private' => [
      'driver'     => 'local',
      'root'       => storage_path('app/private'),
      'visibility' => 'public',
    ],


Можно просто в уже имеющийся локальный скидывать (local, не public), но я предпочитаю порядок.

Далее все загружаемые картинки сохраняем на этот диск.

В моем случае картинки являются аттачами и ссылки на них хранятся в базе.

Пишем метод для отображения пикчи:

// AttachmentController.php
  public function show($id, Request $request, Response $response)
  {
    // Здесь любая логика проверки прав на просмотр файла.
    // ...
    /** @var Attachment $attach */
    $attach = Attachment::findOrFail($id);
    $path = Storage::disk('private')->path($attach->path.$attach->name.'.'.$attach->extension);

    return response()->file($path);
  }


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

Для формирования ссылки сделал хелпер

privateUrl(Attachment $attachment)
  {
    return route('attachment.show', [
      'id'   => $attachment->id,
    ]);
  }


@foreach($files as $attachment)
  <a class="text-underline"
      target="_blank"
      href="{{ privateUrl($attachment) }}"
  >{{ $attachment->original_name }}</a>
@endforeach


PS.
Класс Attachment не является частью фреймворка. Это модель для управления загружаемыми файлами.
Но в целом, я думаю, вам понятен принцип.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Sanes
@Sanes
Приватные файлы должны лежать в Storage и отдаваться скриптом.
https://laravel.com/docs/8.x/filesystem#downloadin...
return Storage::download('file.jpg');

return Storage::download('file.jpg', $name, $headers);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы