Как мне установить CORS?

12

Drupal 8 имеет встроенное ядро ​​RESTful веб-сервиса, и с версии 8.2 нам не нужен модуль cors .

Теперь для использования сервисов мы просто включаем и настраиваем файл default.service.yml, как указано здесь

Однако я не смог настроить эту настройку, чтобы разрешить доступ веб-службы через другой домен.

Моя текущая настройка service.yml для cors:

cors.config:
    enabled: true
    # Specify allowed headers, like 'x-allowed-header'.
    allowedHeaders: ['x-csrf-token,authorization,content-type,accept,origin,x-requested-with']
    # Specify allowed request methods, specify ['*'] to allow all possible ones.
    allowedMethods: ['POST, GET, OPTIONS, DELETE, PUT']
    # Configure requests allowed from specific origins.
    allowedOrigins: ['*']
    # Sets the Access-Control-Expose-Headers header.
    exposedHeaders: false
    # Sets the Access-Control-Max-Age header.
    maxAge: 1000
    # Sets the Access-Control-Allow-Credentials header.
    supportsCredentials: false

Я погуглил, чтобы найти более подробную конфигурацию по этому вопросу, но не смог найти.

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

Использование среды разработки Pantheon для веб-служб и настраиваемого домена .dev для использования этих служб.

Доступ к сервису работает нормально с помощью расширения chrome CORS.

sarathkm
источник
Если вы уже изменили свой сайт / default / services.yml, как сказано в предыдущих ответах, и он не работает, убедитесь, что на вашем веб-сервере включена функция CORS. Например, в Nginx вы должны добавить / изменить местоположение в конфигурации блока вашего сервера, см. Https://enable-cors.org/server_nginx.html
Pin

Ответы:

16

Я столкнулся с этим довольно недавно на Пантеоне, и, надеюсь, это поможет, если вы еще не решили это.

cors.config:
    enabled: true
    # Specify allowed headers, like 'x-allowed-header'.
    allowedHeaders: ['x-csrf-token','authorization','content-type','accept','origin','x-requested-with', 'access-control-allow-origin','x-allowed-header','*']
    # Specify allowed request methods, specify ['*'] to allow all possible ones.
    allowedMethods: ['*']
    # Configure requests allowed from specific origins.
    allowedOrigins: ['http://localhost/','http://localhost:3000','http://localhost:3001','http://localhost:3002','*']
    # Sets the Access-Control-Expose-Headers header.
    exposedHeaders: false
    # Sets the Access-Control-Max-Age header.
    maxAge: false
    # Sets the Access-Control-Allow-Credentials header.
    supportsCredentials: true

Несколько вещей, чтобы отметить ...

Что касается расположения файла в Pantheon, пожалуйста, убедитесь, что ваш файл service.yml находится в / sites / default против just / sites. Я был ошибочно под впечатлением, что это будет работать из обоих мест. Это будет работать только в каталоге / sites / default.

Обратите внимание на список допускаемых заголовков, разделенных запятыми, каждый в своем собственном наборе кавычек. Первоначально у меня была одна строка, как у вас в приведенном выше примере, и она провалилась бесчисленное количество раз, прежде чем я уловил тонкую разницу. Я вполне уверен, что allowMethods работает так же, если вы специально хотите перечислить ваши методы.

Также обратите внимание, что хотя мой фрагмент кода будет хорошо работать для разработки с песочницей Pantheon, вы, скорее всего, захотите еще немного заблокировать его перед началом работы. С Pantheon, предлагающим HTTPS, вы также захотите использовать его, если собираетесь передавать информацию через заголовки. Надеюсь, что это поможет или вам, если у вас все еще есть проблемы, или кому-то еще, кто наткнулся на это в будущем.

Шон Мэтьюз
источник
4
Зачем указывать позволенные Origins, а затем также передавать '*'?
Кристиан
Просто чтобы показать оба варианта. Пожалуйста, не стесняйтесь опускать одно или другое.
Шон Мэтьюз
Экспонированные заголовки должны быть ложными или массивом, в соответствии с drupal.org/project/drupal/issues/2905848
Джон
Если кому-то интересно, я не верю, что в поле allowOrigins допускается регулярное выражение. Я попытался использовать шаблон регулярных выражений для внесения в белый список нескольких поддоменов, и drupal пожаловался. Мне пришлось использовать явный список доменов, разделенных запятыми, как в этом примере. Я надеялся, что он будет вести себя как параметр доверенных хостов в settings.php
Тони Стекка
9

Найти: ... / sites / default / default.services.yml

Сделайте копию и переименуйте копию в:

... / сайты / по умолчанию / services.yml

Найдите эту часть кода: cors.config: enabled: false

и замените его следующим: cors.config: enabled: true

Очистить кеш.

Судип Пол
источник
Я должен испробовал весь до пилы вашего ответа, спасибо за показ наиболее важным момент , который расчищает КЭШ (Rebuild КЭШ): D
мии
3

Следующая настройка работает для меня.

cors.config:
  enabled: true
  # Specify allowed headers, like 'x-allowed-header'.
  allowedHeaders: ['x-csrf-token','authorization','content-type','accept','origin','x-requested-with']
  # Specify allowed request methods, specify ['*'] to allow all possible ones.
  allowedMethods: ['*']
  # Configure requests allowed from specific origins.
  allowedOrigins: ['*']
  # Sets the Access-Control-Expose-Headers header.
  exposedHeaders: false
  # Sets the Access-Control-Max-Age header.
  maxAge: false
  # Sets the Access-Control-Allow-Credentials header.
  supportsCredentials: false
Адитья Джоши
источник
0

ctedHeaders: true недопустимо и вызовет предупреждение: implode (): неверные аргументы переданы в Asm89 \ Stack \ CorsService-> addActualRequestHeaders () (строка 94 из / vendor / asm89 / stack-cors / src / Asm89 / Stack / CorsService. php) # 0 /web/core/includes/bootstrap.inc(584) Это должен быть либо false, либо массив с разрешенными заголовками для показа, см. https://developer.mozilla.org/en-US/docs/Web/ HTTP / Headers / Access-Control-Expose-Headers

Jagermonster
источник