Фон:
У меня есть тонкий 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 (метод запрещен)
Привет, Swoox, заголовок Content-Type отправляется при выполнении успешного или неудачного запроса с использованием $response->withStatus(200)->withHeader("Content-Type","application/json");, поэтому я предполагаю, что он вам не нужен в другом месте
Вам нужно это в htaccess: Access-Control-Allow-Headers: Content-Type Не будь таким упрямым, как мой системный менеджер, я сказал ему это 5 раз, и, наконец, сделал это и исправил.
Я добавил его Swoox, но все равно не повезло, хром жалуется на заголовок «Access-Control-Allow-Origin», поэтому я предполагаю, что проблема в этом.
Проверьте ответ Даана.
Привет, Swoox, я безуспешно пробовал ответ Даана, это был один из первых результатов, появившихся в Google, но ошибка 405 все еще присутствует. Я почти готов бросить курить!






Отправьте заголовок с ответом:
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
Привет, Даан, я добавил в ответ следующий код и все еще получаю ту же ошибку, я также просмотрел документацию и добавил то, что в ней говорится, безуспешно. Кажется, что ни одно решение не работает ...
@MatthewM как выглядит ваш стек? Это apache + modphp или nginx + php-fpm и т. д. Это за балансировщиком нагрузки? Не отключайте CORS, просто узнайте, как правильно настроить веб-сервер. Вы не выбрасываете замок из дверей только потому, что у вас сломан ключ.
Я считаю, что это Apache + modphp без балансировщика нагрузки, я использую MAMP для размещения локальной версии API, на которую указывает приложение, с конфигурацией по умолчанию.
Затем сделайте запрос OPTIONS с помощью curl на конечную точку API и покажите нам заголовки ответов.
Извините за задержку @emix, я не слишком знаком с CURL, так как обычно использую почтальон, поэтому ответ на обычный запрос на размещение - следующие заголовки. Однако запрос параметров содержит только следующие заголовки: Accept-Ranges, Connection, Content-Length и Date.
Делали запрос OPTIONS?
Запрос параметров дал только следующие заголовки ответа: Accept-Ranges, Connection, Content-Length и Date.
Спасибо за подробный комментарий @emix, вы правы, я понятия не имею, как работает CORS. Я прочитал предоставленную выше документацию и добавил код «Простое решение» под $app = new App($config);. Я надеюсь, что это правильное место для добавления этого кода. Спасибо за понимание.
CodeKit был проблемой, потому что CORS не работал. При запуске напрямую через MAMP все запросы возвращались правильно, однако при отправке того же запроса через сервер CodeKit промежуточное ПО CORS не работало.
Я считаю, что ответ Даана больше подходит для тех, у кого есть эта проблема, поэтому отметим его как правильный.
Htaccess явно отсутствует
header('Content-Type: application/json');Access-Control-Allow-Headers: Content-Type