programing

CORS 비행 전 요청이 접근통제 검사를 통과하지 못했습니다.HTTP OK 상태가 아닙니다.

easyjava 2023. 3. 20. 23:40
반응형

CORS 비행 전 요청이 접근통제 검사를 통과하지 못했습니다.HTTP OK 상태가 아닙니다.

Authorization Headers를 사용하여 Wordpress REST API에 GET/POST 요청을 작성하려고 하는데, 이에 대한 응답을 받고 있습니다.

비행 전 요청이 액세스 제어 검사를 통과하지 못했습니다.HTTP OK 상태가 아닙니다.

WP-API 인증을 위해 JWT 인증을 사용하고 있으며, 인터넷에서 찾을 수 있는 거의 모든 옵션을 시도해 보았지만 잘 되지 않았습니다.

현재 .htaccess 설정을 확인합니다.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

</IfModule>

<IfModule mod_headers.c>
  Header always set X-Content-Type-Options "nosniff"
  <IfModule mod_setenvif.c>
    SetEnvIf Origin "^(http://localhost:3000)$" CORS=$0
  </IfModule>
  Header set Access-Control-Allow-Origin %{CORS}e env=CORS
  Header set Access-Control-Allow-Credentials "true" env=CORS
  Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, HEAD" env=CORS
  Header set Access-Control-Allow-Headers "*" env=CORS
  Header set Access-Control-Expose-Headers "*" env=CORS
  <FilesMatch "\.(php|html)$">
  </FilesMatch>
</IfModule>

요청이 axios에서 이루어졌을 때 이 오류가 발생합니다.

오리진 'http://localhost:3000'에서 HIDDEN_SERVER_ADDRESS'의 XMLHttpRequest에 대한 액세스가 CORS 정책에 의해 차단되었습니다.비행 전 요청에 대한 응답이 액세스 제어 검사를 통과하지 못했습니다.HTTP OK 상태가 아닙니다.

PostMan에서 통화는 정상적으로 동작하고 있으며 원하는 결과를 얻을 수 있습니다.

.htaccess에서 가능한 모든 솔루션을 시도해봐도 도움이 되지 않았습니다.다른 누군가가 같은 생각을 하고 있다면, 여기 나에게 효과가 있는 솔루션이 있습니다.

이 코드를 index.filename 파일에 넣으면 마법처럼 작동합니다.

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method,Access-Control-Request-Headers, Authorization");
header('Content-Type: application/json');
$method = $_SERVER['REQUEST_METHOD'];
if ($method == "OPTIONS") {
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method,Access-Control-Request-Headers, Authorization");
header("HTTP/1.1 200 OK");
die();
}

아자즈 칸이 제공한 해결책은 내게 효과가 있었다.OPTIONS 방식의 요청에 대해 왜 동작하는지 검색해보니

CORS(Cross-Origin Resource Sharing)를 사용하면 OPTIONS를 포함한 사전 전송 요청이 자동으로 전송되므로 대상 리소스가 허용 가능한 매개 변수로 응답합니다.일반적인 웹 개발 시나리오에서는 OPTION 호출은 브라우저에서 발행되므로 할 필요가 없습니다.

그래서 인증요청 전에 OPTIONS 방식의 요구가 발생했지만 백엔드 API에서 200 OK 응답이 반환되지 않았다고 생각합니다.백엔드에서 PHP 오류(아마 404 http 오류)가 반환되었습니다.체크하지 않았습니다만, 이 코드로 API가 200 OK 응답을 반환하는 것은 종료 때문입니다.

<?php
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json; charset=UTF-8');
header('Access-Control-Allow-Methods: GET,POST,PUT,PATCH,DELETE');
header('Access-Control-Allow-Headers: Content-Type,Access-Control-Allow-Headers,Authorization,X-Requested-With');

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  header('HTTP/1.1 200 OK');
  exit();
}

언급URL : https://stackoverflow.com/questions/57901808/cors-preflight-request-doesnt-pass-access-control-check-it-does-not-have-http

반응형