Что может предотвратить переопределение Access-Control-Allow-Origin на сервере? - PullRequest
0 голосов
/ 11 января 2019

У меня есть сайт WP с API, и я звоню на другой сайт. Я получаю эту ошибку

Доступ к XMLHttpRequest на www.wpsiteurl.com от происхождения www.theothersiteurl.com был заблокирован CORS политика: Ответ на предполётный запрос не проходит контроль доступа проверка: заголовок «Access-Control-Allow-Origin» содержит несколько значения «www.theothersiteurl.com, *», но допускается только одно.

Я нашел решения здесь и здесь , которые в основном вводят добавление этого в функцию регистра:

remove_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' );
add_action( 'rest_pre_serve_request', function ($value) {
    $origin = get_http_origin();
    header( 'Access-Control-Allow-Headers: X-Requested-With' );
    header( 'Access-Control-Allow-Methods: POST, GET' );
    header( 'Access-Control-Allow-Origin: *');
    header( 'Access-Control-Allow-Credentials: true');
    return $value;
});

Для меня это не работает, так как он просто возвращает * или все, что добавлено в качестве источника и другого *. Изменение второго аргумента не помогает, похоже, что после добавления этого действия к источникам добавлен подстановочный знак.

Я отредактировал файл .htaccess, как советовали в ответах. Это работало в другой среде, где я тестировал решение. Однако на другом сервере этого не произошло - источник был добавлен в строку источников, как если бы он был добавлен с php.

Мне кажется, что есть что-то, что мешает полностью переопределить access-control-allow-origin и заставляет добавлять к нему.

Мои вопросы:

  • Что может привести к тому, что сервер не разрешит установить один Access-Control-Allow-Origin?
  • Как мне "переопределить" или очистить Access-Control-Allow-Origin?

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Заголовок «Access-Control-Allow-Origin» содержит несколько значений «www.theothersiteurl.com, *», но допускается только одно.

Вы должны быть очень осторожны, чтобы установить этот заголовок только в одной точке. Это можно сделать в 3 местах:

  • Базовая конфигурация Apache
  • .htaccess
  • PHP

Я бы порекомендовал сделать это внутри основной конфигурации Apache из-за соображений производительности и безопасности.

Однако, если вы хотите добиться этого с помощью файла .htaccess, убедитесь, что в PHP ничего не изменилось, и убедитесь, что AllowOverride разрешен в блоке <VirtualHost>.

0 голосов
/ 14 января 2019

Существует несколько способов добиться этого с несколькими хостами. Один с .htaccess, другой с php.

С .htaccess:

<IfModule mod_headers.c>
    SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.example|dev02.otherdomain.example)$" AccessControlAllowOrigin=$0
    Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    Header merge Vary Origin
</IfModule>

С PHP:

$origin = $_SERVER['HTTP_ORIGIN'];

if ($origin == "http://www.domain1.com"
        || $origin == "http://www.domain2.com"
        || $origin == "http://www.domain3.com") {
    header("Access-Control-Allow-Origin: $origin");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...