Проблема Laravel CORS для общедоступных файлов


Проблема Laravel CORS для общедоступных файлов

04.11.2020 11:21:25 Просмотров 7 Источник

Я пытаюсь получить доступ к URL-адресу файла журнала из Angular, но он показывает следующую ошибку:

Access to XMLHttpRequest at 'https://myurl.com/storage/rmlogs/MyFileNameDetail.log' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Все запросы API работают отлично, и ошибка возникает только для запросов файлов. У меня есть мои файлы, хранящиеся в каталоге rmlogs, который находится в каталоге storage/app/public/rmlogs, и он связан с общей папкой.

Кодовая база API-это Laravel, и файлы хранятся в каталоге storage. Я могу получить доступ к файлу через браузер, а также почтальона. Поскольку URL-адрес является общедоступным, ему не нужен токен аутентификации, который я передаю для других запросов API.

У меня есть конфигурационный файл cors.php следующим образом:

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Cross-Origin Resource Sharing (CORS) Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure your settings for cross-origin resource sharing
    | or "CORS". This determines what cross-origin operations may execute
    | in web browsers. You are free to adjust these settings as needed.
    |
    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
    |
    */

    'paths' => ['api/*'],

    'allowed_methods' => ['*'],

    'allowed_origins' => ['*'],

    'allowed_origins_patterns' => [],

    'allowed_headers' => ['*'],

    'exposed_headers' => [],

    'max_age' => 0,

    'supports_credentials' => true,

];

и имеет промежуточное программное обеспечение Cors.php, как указано ниже:

<?php

namespace App\Http\Middleware;

use Closure;

class Cors
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
    return $next($request)
        ->header('Access-Control-Allow-Origin', '*')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
    }
}
У вопроса есть решение - Посмотреть?

Ответы - Проблема Laravel CORS для общедоступных файлов / Laravel CORS issue for public files

Quentin

04.11.2020 11:28:11

Через этот блог:

существуют пакеты, которые позволяют добавлять заголовки CORS к ответам, отправленным из API Laravel. Они делают это, применяя промежуточное программное обеспечение ко всем маршрутам API. Однако такое промежуточное программное обеспечение не применяется к общедоступному каталогу, и это часто является местом хранения таких ресурсов , как изображения аватаров пользователей. Поэтому, когда эти ресурсы возвращаются в браузер, к ним не применяются необходимые заголовки CORS.

Поэтому вам нужно применить заголовки с помощью какого-то другого метода. Это, вероятно, наиболее легко сделать с помощью конфигурационных файлов вашего HTTP-сервера.

Вы пометили этот так что можете установить:

Header set Access-Control-Allow-Origin "*"

В вашем конфигурационном файле.

Например:

<Location "/storage/rmlogs/">
    Header set Access-Control-Allow-Origin "*"
</Location>

Вы также можете поместить директиву Header в файл.htaccess , но это не рекомендуется:

Вы должны полностью избегать использования файлов .htaccess, если у вас есть доступ к файлу конфигурации основного сервера httpd. Использование файлов .htaccess замедляет работу вашего HTTP-сервера Apache. Любая директива, которую вы можете включить в файл .htaccess, лучше установить в блоке каталогов, так как она будет иметь тот же эффект с лучшей производительностью.

Если вы находитесь на общем хостинге, то у вас, возможно, нет выбора.

Tschallacka

04.11.2020 11:28:45

Вы получаете доступ к файлу в нестандартном каталоге хранения. Возможно, ваш запрос не фильтруется через laravel, потому что он находится в каталоге хранения, который часто разрешает прямой доступ.

В этом случае он обрабатывается веб-сервером. Это правила доступа к хранилищу, которые переписываются на контроллер laravel в моей установке через htaccess.

RewriteRule ^storage/cms/.* index.php [L,NC]
RewriteRule ^storage/logs/.* index.php [L,NC]
RewriteRule ^storage/framework/.* index.php [L,NC]
RewriteRule ^storage/temp/protected/.* index.php [L,NC]
RewriteRule ^storage/app/uploads/protected/.* index.php [L,NC]

Как вы можете видеть, storage/rmlogs не является его частью, поэтому он обрабатывается веб-сервером, если я попытаюсь получить доступ к каталогу rmlogs в хранилище.

Решить это можно сделать .откройте файл. htaccess правило, чтобы добавить его, если вы работать на Apache или директивы nginx, если вы запустите nginx.

RewriteRule ^storage/rmlogs/.* index.php [L,NC]
Помочь в развитии проекта:
Закрыть X