Отключить CORS из-за проблемных ошибок 405

Фон:

У меня есть тонкий API, созданный и в настоящее время работающий в локальном домене, например localhost / api

У меня есть мобильное приложение, использующее ионную структуру (основанную на angular), и следующий код, использующий httpClient как http:

let accessurl = this.general.apiURL + '/v2/update/status/' + this.machineToChange;
    const headers = new HttpHeaders()
      .set('Authorization', 'Bearer: ' + this.general.apiKey);
    this.http.put(accessurl, {
      statusFuelled: 1
    }, { headers: headers }).subscribe(result => {
      console.info(JSON.stringify(result));
    }, err => {
      console.info(JSON.stringify(err));
    });

Я пробовал каждый вопрос о переполнении стека, который мог найти, чтобы позволить тонкой структуре отключить cors, вот лишь некоторые из них:

$app->options('/update/status/{machineNo}', function ($request, $response) {
  header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
  header('Access-Control-Allow-Credentials: true');
  header('Access-Control-Max-Age: 86400');    // cache for 1 day
  return $response->withStatus(200);
});

Или же:

//http://stackoverflow.com/questions/18382740/cors-not-working-php
  if (isset($_SERVER['HTTP_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']))
          header("Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS");

      if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
          header("Access-Control-Allow-Headers:        {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

      exit(0);
  }

Или же:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
header('Content-Type: application/json');

Или в .HTACCESS:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
Header add Access-Control-Allow-Headers: Content-Type

И многие другие промежуточные программы, использующие composer.

Я также безуспешно запускал код из Тонкий веб-сайт.

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

Я понятия не имею, где проблема вызвана, неправильным запросом httpClient или CORS, как обычно, с болью.

Если кто-нибудь может помочь, дайте мне знать.

Я использую PHP 5.6 из-за ограничений сервера, поэтому промежуточное ПО, такое как tuupola / cors, не будет работать из-за того, что PHP <7

Некоторые ошибки:

Safari Throws: не удалось загрузить ресурс: предполетный ответ не прошел

Выдает Chrome: ответ на предварительный запрос не проходит проверку контроля доступа: на запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin. Следовательно, к источнику 'http: // локальный: 8100' доступ не разрешен. Ответ имел код состояния HTTP 405.

Chrome также выдает: OPTIONS http: // локальный / api / v2 / обновление / статус / {ID} 405 (метод запрещен)

Htaccess явно отсутствует header('Content-Type: application/json');Access-Control-Allow-Headers: Content-Type

Swoox 07.06.2018 11:58

Привет, Swoox, заголовок Content-Type отправляется при выполнении успешного или неудачного запроса с использованием $response->withStatus(200)->withHeader("Content-Type","appli‌​cation/json");, поэтому я предполагаю, что он вам не нужен в другом месте

Matthew M 07.06.2018 12:00

Вам нужно это в htaccess: Access-Control-Allow-Headers: Content-Type Не будь таким упрямым, как мой системный менеджер, я сказал ему это 5 раз, и, наконец, сделал это и исправил.

Swoox 07.06.2018 12:01

Я добавил его Swoox, но все равно не повезло, хром жалуется на заголовок «Access-Control-Allow-Origin», поэтому я предполагаю, что проблема в этом.

Matthew M 07.06.2018 12:03

Проверьте ответ Даана.

Swoox 07.06.2018 12:04

Привет, Swoox, я безуспешно пробовал ответ Даана, это был один из первых результатов, появившихся в Google, но ошибка 405 все еще присутствует. Я почти готов бросить курить!

Matthew M 07.06.2018 12:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
605
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Отправьте заголовок с ответом:

return $response
        ->withHeader('Access-Control-Allow-Origin', '*')
        ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization')
        ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');

См. Также тонкую документацию: https://www.slimframework.com/docs/v3/cookbook/enable-cors.html

Привет, Даан, я добавил в ответ следующий код и все еще получаю ту же ошибку, я также просмотрел документацию и добавил то, что в ней говорится, безуспешно. Кажется, что ни одно решение не работает ...

Matthew M 07.06.2018 12:07

@MatthewM как выглядит ваш стек? Это apache + modphp или nginx + php-fpm и т. д. Это за балансировщиком нагрузки? Не отключайте CORS, просто узнайте, как правильно настроить веб-сервер. Вы не выбрасываете замок из дверей только потому, что у вас сломан ключ.

emix 07.06.2018 12:37

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

Matthew M 07.06.2018 12:39

Затем сделайте запрос OPTIONS с помощью curl на конечную точку API и покажите нам заголовки ответов.

emix 07.06.2018 12:40

Извините за задержку @emix, я не слишком знаком с CURL, так как обычно использую почтальон, поэтому ответ на обычный запрос на размещение - следующие заголовки. Однако запрос параметров содержит только следующие заголовки: Accept-Ranges, Connection, Content-Length и Date.

Matthew M 07.06.2018 12:56

Делали запрос OPTIONS?

emix 07.06.2018 13:01

Запрос параметров дал только следующие заголовки ответа: Accept-Ranges, Connection, Content-Length и Date.

Matthew M 07.06.2018 13:02

Спасибо за подробный комментарий @emix, вы правы, я понятия не имею, как работает CORS. Я прочитал предоставленную выше документацию и добавил код «Простое решение» под $app = new App($config);. Я надеюсь, что это правильное место для добавления этого кода. Спасибо за понимание.

Matthew M 07.06.2018 13:08

CodeKit был проблемой, потому что CORS не работал. При запуске напрямую через MAMP все запросы возвращались правильно, однако при отправке того же запроса через сервер CodeKit промежуточное ПО CORS не работало.

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

Другие вопросы по теме