Реализует https://github.com/fruitcake/php-cors для Laravel.
Начиная с Laravel 9.2, это промежуточное программное обеспечение включено в laravel/framework. Вы можете использовать предоставленное промежуточное программное обеспечение, которое должно быть совместимо с промежуточным программным обеспечением и конфигурацией, представленными в этом пакете. См. https://github.com/laravel/laravel/pull/5825/files, чтобы узнать об изменениях.
Шаги по обновлению:
Удалите "fruitcake/laravel-cors"
из вашего композитора.json.
Замените FruitcakeCorsHandleCors::class,
на IlluminateHttpMiddlewareHandleCors::class,
в app/Http/Kernel.php
См. https://github.com/fruitcake/php-cors
для расширенного использования. Конфигурация остается прежней.
Пакет laravel-cors
позволяет отправлять заголовки совместного использования ресурсов Cross-Origin с настройкой промежуточного программного обеспечения Laravel.
Если вы хотите получить глобальный обзор рабочего процесса CORS, вы можете просмотреть это изображение.
При обновлении с версии 0.x есть некоторые критические изменения:
Новое свойство paths используется для включения/отключения CORS на определенных маршрутах. По умолчанию оно пусто, поэтому заполните его правильно!
Промежуточное программное обеспечение группы больше не поддерживается, используйте глобальное промежуточное программное обеспечение.
Название поставщика изменилось (см. установку/использование)
Регистр реквизитов в cors.php
изменился с CamelCase на Snake_case, поэтому, если у вас уже есть файл cors.php
вам нужно будет обновить реквизиты в нем, чтобы они соответствовали новому регистру.
Обрабатывает предполетные запросы OPTIONS CORS.
Добавляет заголовки CORS в ваши ответы.
Сопоставьте маршруты, чтобы добавлять CORS только к определенным запросам.
Требуйте пакет fruitcake/laravel-cors
в вашем composer.json
и обновите зависимости:
композитору требуется фруктовый пирог/laravel-cors
Если вы столкнулись с конфликтом, это может быть связано с тем, что установлена более старая версия barryvdh/laravel-cors илиfruitcake/laravel-cors. Сначала удалите конфликтующий пакет, а затем повторите попытку установки:
композитор удалить barryvdh/laravel-corsfruitcake/laravel-cors композитору требуется фруктовый пирог/laravel-cors
Чтобы разрешить CORS для всех ваших маршрутов, добавьте промежуточное программное обеспечение HandleCors
вверху свойства $middleware
класса app/Http/Kernel.php
:
protected $middleware = [ FruitcakeCorsHandleCors::class, // ...];
Теперь обновите конфигурацию, чтобы определить пути, по которым вы хотите запустить службу CORS (см. Конфигурацию ниже):
'пути' => ['api/*'],
Значения по умолчанию установлены в config/cors.php
. Опубликуйте конфигурацию, чтобы скопировать файл в вашу собственную конфигурацию:
поставщик php artisan:publish --tag="cors"
Примечание. При использовании пользовательских заголовков, таких как
X-Auth-Token
илиX-Requested-With
, вы должны установитьallowed_headers
для включения этих заголовков. Вы также можете установить для него значение['*']
чтобы разрешить все пользовательские заголовки.
Примечание. Если вы явно добавляете заголовки в белый список, вы должны включить
Origin
, иначе запросы не будут распознаваться как CORS.
Вариант | Описание | Значение по умолчанию |
---|---|---|
пути | Вы можете включить CORS для одного или нескольких путей, например. ['api/*'] | [] |
разрешенные_методы | Соответствует методу запроса. | ['*'] |
разрешенные_источники | Соответствует источнику запроса. Можно использовать подстановочные знаки, например. *.mydomain.com или mydomain.com:* | ['*'] |
разрешенные_оригины_паттерны | Сопоставляет источник запроса с preg_match . | [] |
разрешенные_заголовки | Устанавливает заголовок ответа Access-Control-Allow-Headers. | ['*'] |
подвергаемые_заголовки | Устанавливает заголовок ответа Access-Control-Expose-Headers. | [] |
максимальный_возраст | Устанавливает заголовок ответа Access-Control-Max-Age. | 0 |
support_credentials | Устанавливает заголовок Access-Control-Allow-Credentials. | false |
allowed_origins
, allowed_headers
и allowed_methods
можно установить значение ['*']
чтобы принять любое значение.
Примечание. Для
allowed_origins
необходимо включить схему, если не используется подстановочный знак, например.['http://example.com', 'https://example.com']
. Также необходимо учитывать, что схема будет присутствовать при использованииallowed_origins_patterns
.
Примечание. Постарайтесь быть как можно более конкретными. Вы можете начать разработку со свободными ограничениями, но лучше быть максимально строгими!
Примечание. Из-за переопределения метода http в Laravel разрешение методов POST также позволит пользователям API выполнять запросы PUT и DELETE.
Примечание. Иногда необходимо указать порт (например, когда вы пишете код приложения в локальной среде) . Здесь вы также можете указать порт или использовать подстановочный знак, например.
localhost:3000
,localhost:*
или даже полное доменное имяapp.mydomain.com:8080
В Lumen просто зарегистрируйте ServiceProvider вручную в файле bootstrap/app.php
:
$app->register(FruitcakeCorsCorsServiceProvider::class);
Также скопируйте файл конфигурации cors.php в config/cors.php
и примените его в действие:
$app->configure('cors');
Чтобы разрешить CORS для всех ваших маршрутов, добавьте промежуточное программное обеспечение HandleCors
в глобальное промежуточное программное обеспечение и установите свойство paths
в конфигурации.
$app->middleware([// ...FruitcakeCorsHandleCors::class, ]);
Убедитесь, что параметр path
в конфигурации правильный и действительно соответствует используемому вами маршруту. Не забудьте также очистить кэш конфигурации.
Иногда ошибки/промежуточное программное обеспечение, возвращающее собственные ответы, могут помешать запуску промежуточного программного обеспечения CORS. Попробуйте изменить порядок промежуточного программного обеспечения и убедитесь, что это первая запись в глобальном промежуточном программном обеспечении, а не группа маршрутов. Также проверьте свои журналы на наличие реальных ошибок, поскольку без CORS ошибки будут проглатываться браузером, показывая только ошибки CORS. Также попробуйте запустить его без CORS, чтобы убедиться, что он действительно работает.
Если ваш запрос включает заголовок авторизации или использует режим учетных данных, установите для значения supports_credentials
в конфигурации значение true. Это установит для заголовка Access-Control-Allow-Credentials значение true
.
Если вы используете echo()
, dd()
, die()
, exit()
, dump()
и т. д. в своем коде, вы нарушите поток промежуточного программного обеспечения. Если выходные данные отправляются перед заголовками, CORS добавить невозможно. Если сценарий завершается до завершения работы промежуточного программного обеспечения CORS, заголовки CORS добавляться не будут. Всегда возвращайте правильный ответ или выдавайте исключение.
Если возможно, используйте группу маршрутов с отключенной защитой CSRF. В противном случае вы можете отключить CSRF для определенных запросов в AppHttpMiddlewareVerifyCsrfToken
:
protected $Exception = ['api/*','sub.domain.zone' => [ 'prefix/*'], ];
Промежуточное программное обеспечение CORS должно быть единственным местом, куда вы добавляете эти заголовки. Если вы также добавите заголовки в .htaccess, nginx или файл index.php, вы получите дублирующиеся заголовки и неожиданные результаты.
Если вы не выполняете межсайтовые запросы, то есть если вы не запрашиваете site-a.com/api с сайта site-b.com, ваш браузер не отправит заголовок запроса Origin: https://site-b.com
, CORS будет «отключен», поскольку заголовок Access-Control-Allow-Origin
также будет отсутствовать. Это происходит потому, что запросы отправляются оттуда же, и в этом случае защита не требуется.
Выпущено по лицензии MIT, см. ЛИЦЕНЗИЮ.