Укажите несколько поддоменов с источником контроля доступа - PullRequest
7 голосов
/ 09 марта 2012

Я пытаюсь разрешить доступ ко всем поддоменам на моем сайте, чтобы разрешить перекрестные вызовы AJAX для поддоменов.Есть ли способ указать все дочерние домены сайта, такие как *.example.com или, альтернативно, почему не работает следующее, если в моем списке более одного домена:

header('Access-Control-Allow-Origin: http://api.example.com http://www.example.com');

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

Access-Control-Allow-Origin Multiple Origin Domains?

Если вышеуказанный вопрос является решением этой проблемы, то как я могу получить источник из заголовка.Похоже, что $ _SERVER ['HTTP_ORIGIN'] очень ненадежный и даже не кросс-браузерный.Мне нужно иметь возможность видеть источник в любом браузере, который может показать ошибку при попытке отправить вызов AJAX с использованием JavaScript.

Ответы [ 5 ]

17 голосов
/ 16 марта 2012

Решением этой проблемы является использование переменной $ _SERVER ['HTTP_ORIGIN'], чтобы определить, поступил ли запрос от разрешенного домена. Затем он установил это:

header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
12 голосов
/ 04 июня 2018

Вот как я это сделал.

Заголовок Origin указывается браузером и будет содержать домен, который запросил скрипт в другом домене:

Origin: http://www.websiteA.com

Поэтому выможет "белый список" нескольких доменов в вашем серверном скрипте:

$allowedOrigins = [
    "http://www.websiteA.com",
    "https://www.websiteB.com"
    // ... etc
];

Затем вы можете проверить, содержит ли глобальный $_SERVER["HTTP_ORIGIN"] домен в этом белом списке:

if (in_array($_SERVER["HTTP_ORIGIN"], $allowedOrigins)) {

И установите для заголовка ответа Access-Control-Allow-Origin значение заголовка Origin:

header("Access-Control-Allow-Origin: " . $_SERVER["HTTP_ORIGIN"]);

Полный сценарий:

$allowedOrigins = [
    "http://www.websiteA.com",
    "https://www.websiteB.com"
    // ... etc
];

if (in_array($_SERVER["HTTP_ORIGIN"], $allowedOrigins)) {
    header("Access-Control-Allow-Origin: " . $_SERVER["HTTP_ORIGIN"]);
}
3 голосов
/ 12 апреля 2018

Несмотря на то, что ответ работает, он побеждает цель всего этого, поскольку он разрешает запросы от любого хоста.

Я использую что-то вроде:

if(isset($_SERVER['HTTP_ORIGIN'])) {
  $origin = $_SERVER['HTTP_ORIGIN'];
  if($origin == 'https://sub1.my-website.com' OR $origin == 'https://sub2.my-website.com') {
    header("Access-Control-Allow-Origin: $origin");
  }
}
0 голосов
/ 18 мая 2018

Я пытался использовать этот подход для достижения ограничения на основе конкретного домена:

$allowed_origin = '';
$parts = explode('.', parse_url($_SERVER['HTTP_HOST'])['host']);
if(end($parts).".".prev($parts) === "com.domain") {
    $allowed_origin = $_SERVER['HTTP_ORIGIN'];
    header('Acesss-Control-Allow-Origin: '. $allowed_origin);
}

Я надеюсь, что это работает.

0 голосов
/ 09 марта 2012

Вот хорошая статья о вашем вопросе: http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/

Если это недостаточно хорошо или не работает, вам нужен прокси-сервер: https://raw.github.com/cowboy/php-simple-proxy/master/ba-simple-proxy.php

Затем вы можете вызвать прокси с такими параметрами: http://www.example.com/ba-simple-proxy.php?url=https://api.example.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...