Ошибка CORS при попытке получить изображения на Symfony 3

#image #symfony #cors #symfony3.x

Вопрос:

У меня проблема в моем проекте, у меня есть приложение Cordova на таблетки, которые нужно извлечь изображение из API, то API будет на на Symfony 3 и Nelmio CORS в пакет установлен и настроен, стандарт сделать запрос на работу и у меня есть кросс-происхождения-разрешение на заголовок, но когда я пытаюсь получить изображение сети скажешь мне «технологии CORS ошибка: MissingAllowOriginHeader».

конфигурация моего пакета:

 nelmio_cors:
    defaults:
        allow_credentials: false
        allow_origin: []
        allow_headers: []
        allow_methods: []
        expose_headers: []
        max_age: 0
        hosts: []
    paths:
        '^/medias/':
            allow_origin: ['*']
            allow_headers: ['*']
            allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
            max_age: 3600
        '^/api/':
            allow_origin: ['*']
            allow_headers: ['*']
            allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
            max_age: 3600
 

и мой код, который извлекает изображение:

 const prom = axios({method: "get", url: encodeURI(element.url), responseType: responseType}).then((response) => {
                if (process.env.cordova)
                    createFile(element.id, extension, response.data);
                else
                    response.data.pipe(fs.createWriteStream("./server/public/"   path));
            }).catch((error) => {console.log("IMG DL ERROR FOR "   element.id   " : "   error)});
 

элемент-это массив, содержащий URL-адрес изображения, тип и расширение.

это пример URL-адреса, который работает :

https://www.#######.com/api/updates/15151

И этот не работает:

https://#######.com/medias/images/item/4146/andalouse.jpg

Ответ №1:

Пакет Nelmio CORS предоставляет простой способ управления CORS, в этом случае отсутствует узел origin_regex.

 nelmio_cors:
    defaults:
        allow_credentials: false
        allow_origin: []
        allow_headers: []
        allow_methods: []
        expose_headers: []
        max_age: 0
        hosts: []
    paths:
        '^/medias/':
            origin_regex: true
            allow_origin: ['*']
            allow_headers: ['*']
            allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
            max_age: 3600
        '^/api/':
            origin_regex: true
            allow_origin: ['*']
            allow_headers: ['*']
            allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
            max_age: 3600
 

Что ж, теперь давайте поговорим о allow_origin: ['*'] том, если вы используете эту конфигурацию, вам не нужен nemio в вашем проекте, в этом случае вы можете изменить для этого файл nemio_cors.yml с вашим URL-адресом производства и переопределить его в вашем локальном env для разработчиков:

nemio.yml

 nelmio_cors:
    defaults:
        allow_credentials: false
        allow_origin: []
        allow_headers: []
        allow_methods: []
        expose_headers: []
        max_age: 0
        hosts: []
    paths:
        '^/medias/':
            origin_regex: true
            allow_origin: ['^http://www.#######.com', '^http://#######.com']
            allow_headers: ['*']
            allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
            max_age: 3600
        '^/api/':
            origin_regex: true
            allow_origin: ['^http://www.#######.com', '^http://#######.com']
            allow_headers: ['*']
            allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
            max_age: 3600
 

dev/nemio.yml

 nelmio_cors:
    paths:
        '^/medias/':
            allow_origin: ['*']
        '^/api/':
            allow_origin: ['*']
 

другое решение-добавить параметр env со списком источников, как это делает nemio в SF 5.

 nelmio_cors:
    defaults:
        origin_regex: true
        allow_origin: ['%env(CORS_ALLOW_ORIGIN)%']
        allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']
        allow_headers: ['Content-Type', 'Authorization']
        expose_headers: ['Link']
        max_age: 3600