Я не получаю «Access-Control-Allow-Origin» после бесчисленного количества раз, когда мой скрипт работает - PullRequest
0 голосов
/ 03 октября 2018

Я строю небольшой API на фоне сервера из php.Я использую поддомен api.website.com.Просто для отладки у меня есть это поверх индекса моего index.php в поддомене

header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Credentials: true');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE");

, а для моего кода javascript на главном сайте есть.

$.ajax({
  xhrFields: {
    withCredentials: true
  },
  headers: {
    "X-My-Custom-Header": "some value"
  },
  url: 'https://api.website.com/',
  type: 'GET',
  processData: false,
  contentType: "application/json",
  dataType: 'json',
  data: '{}',
  success: function(r) {
    console.log(r);
  },
  error: function(r) {}
});

Все этоработал нормально до буквально вчера, сегодня, когда я начал работать над этим, я получил это.

Ответ на предпечатный запрос не проходит проверку контроля доступа: нет заголовка 'Access-Control-Allow-Origin'присутствует на запрашиваемом ресурсе.Origin 'https://website.com' поэтому не имеет доступа

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

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Вы не можете использовать withCredentials и подстановочный знак.В противном случае это риск безопасности.Смотри: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin#Directives

0 голосов
/ 03 октября 2018

Хорошо, я не знаю, как я решил проблему, но я думаю, как в приведенном выше комментарии сказано, что заголовок был кешем.Я перезапускаю ssl с cloudflare, потому что он любит кэшировать все.Теперь, чтобы заставить его работать, я должен удалить эти две вещи из javascript.

headers: {"X-My-Custom-Header": "some value"},

и

contentType: "application/json",

из всех моих вызовов ajax.

какЯ упомянул подстановочный знак, который я использовал только для целей тестирования, просто чтобы посмотреть, была ли проблема в моем динамическом php-коде.К счастью, это было не так.

function cors() {

$domain = ltrim($_SERVER['HTTP_HOST'], "api.");
$origin = $_SERVER['HTTP_ORIGIN'];


if (preg_match("/^http[s]?[:]\/\/(w{3})?[.a-zA-Z ]*".$domain."$/i", $origin)) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        // may also be using PUT, PATCH, HEAD etc
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    exit(0);
}
header('Content-Type: application/json');
header('Accept: application/json');
}

В начале это вызывается cors ();не вызывать перекрестного загрязнения коллектора и континента.

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

Обновление: я думал, что cloudflare портит заголовки https://support.cloudflare.com/hc/en-us/articles/200308847-Does-Cloudflare-support-Cross-origin-resource-sharing-CORS- Но похоже, что это могут быть не они, хотя и очищали кеш, который они помогли.Тогда я застрял на другой проблеме, POST и GET работали просто отлично, но не такие вещи, как DELETE и OPTIONS.Поэтому после анализа и исследования я обнаружил, что header () в PHP не работал.Оказывается, заголовки PHP не установлены с litespeed (но работают с apache) из-за litespeed.

Мне нужно иметь заголовки на .htaccess как временное исправление.Я имею в виду, что заголовки PHP работают, но по какой-то странной причине то, что я вижу в заголовках для программы почтальона, не согласовано в AJAX.

0 голосов
/ 03 октября 2018

В некоторых случаях, когда страницы обслуживаются из кэша сервера, заголовок Access-Control-Allow-Origin отсутствует, убедитесь, что страница не обслуживается из кэша, или убедитесь, что в кэш-памяти содержится этот заголовок.

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