>  Q&A  >  본문

PHP의 CORS 문제: 실행 전 요청의 응답이 전달되지 않습니다. 허용된 소스

그래서 CORS 게시물이 많이 있다는 걸 알고 있고 그냥 추가하는 중인데 도움이 될만한 답변을 찾을 수 없습니다. 그래서 저는 PHP API를 사용하는 Angular 4 애플리케이션을 구축하고 있습니다. 로컬에서 문제 없이 작동합니다. app.example.com 的应用程序和位于 api.example.com에 있는 API가 있는 도메인에 이를 던지면 다음 오류가 발생하여 로그인을 통과할 수 없습니다.

XMLHttpRequest는 http://api.example.com/Account/Login을 로드할 수 없습니다. 실행 전 요청에 대한 응답이 액세스 제어 확인에 실패했습니다: 아니요 요청에 'Access-Control-Allow-Origin' 헤더가 있습니다. 자원. 따라서 소스 "http://app.example.com"은 허용되지 않습니다. 입장.

내 PHP 코드는 다음과 같습니다:

으아악

내 Angular 게시물은 다음과 같습니다:

으아악

Postman을 통해 요청을 실행하면(CORS에는 영향을 미치지 않음) 다음을 얻습니다.

으아악

이것이 문제의 핵심인지 테스트하고 확인하기 위해 원점을 '*'으로 설정하려고 시도했지만 여전히 같은 방식으로 실패했습니다.

편집 아래 정보로 업데이트하면 됩니다. 헤더에서 대소문자를 변경해도 아무런 효과가 없으며 if 문에서 코드를 꺼내도 효과가 없습니다.

라이브 앱에 로컬 API로 이동하도록 지시하여 PHP를 디버깅했는데 PHP가 예상대로 작동하고 있습니다. 헤더를 설정하고 모든 if 문에 넣습니다.

편집샷 2 정말 도움이 필요하고 누구든지 아이디어가 있으면 정말 감사하겠습니다.

편집샷 3 PHP 대신 .htaccess에 모든 헤더 항목을 설정하면 통과할 수 있습니다. 하지만 이제 위에 나열된 오류가 발생합니다. 이는 Postman을 사용할 때 항상 발생하지만 실제 웹사이트를 사용할 때 발생하는 오류입니다.

{"error":"invalid_client","error_description":"在标头或正文中找不到客户端凭据"}

내 응답 헤더는 다음과 같습니다

으아악

작동되면 *에서 내 도메인으로 변경하겠습니다. 하지만 지금은 *로 남겨둡니다.

요청 시 내 헤더.

P粉564192131P粉564192131338일 전629

모든 응답(2)나는 대답할 것이다

  • P粉952365143

    P粉9523651432023-10-22 00:47:32

    저의 비슷한 경우에는 Angular 프론트엔드와 Php 백엔드가 아래 코드에 도움이 되었습니다. 먼저 헤더를 보냅니다:

    으아아아

    그 이후에는 옵션 요청을 무시할 수 있습니다.

    으아아아

    이 접근 방식은 Angular에 포함된 요청 메서드 "게시" 및 "삭제"를 처리하는 데 도움이 되었습니다.

    회신하다
    0
  • P粉860370921

    P粉8603709212023-10-22 00:29:25

    좋아요, 최근에 비슷한 문제가 있었는데 .htaccess 없이 백엔드에서만 모든 문제를 해결했습니다.

    브라우저가 서버 간 요청을 보낼 때 먼저 OPTIONS 요청을 보내 해당 요청이 유효한지 확인하고 "실제" 요청을 보낼 수 있는지 확인합니다. OPTIONS로부터 올바르고 유효한 응답을 받으면 "실제" 요청이 전송됩니다.

    이제 백엔드에 대한 두 요청 모두에 대해 콘텐츠 유형, 허용 원본, 허용 헤더 등 올바른 헤더가 반환되는지 확인해야 합니다.

    백엔드의 OPTIONS 요청에서 애플리케이션이 애플리케이션의 전체 흐름을 계속하는 대신 헤더를 반환하고 응답을 반환하는지 확인하세요.

    "실제" 요청에서는 올바른 헤더와 일반 응답 본문을 반환해야 합니다.

    예:

    으아악

    기억해야 할 사항:

    • 사용하는 경우: "Access-Control-Allow-Credentials" = true "Access-Control-Allow-Origin"이 "*"가 아닌지 확인하고 올바른 도메인으로 설정해야 합니다! (여기서 피가 많이 흘렀어요 :)

    • "Access-Control-Allow-Headers"에서 얻을 수 있는 허용 헤더를 정의하세요. 정의하지 않으면 요청이 실패합니다

    • "Authorization: Bearer"를 사용하는 경우 "Access-Control-Allow-Headers"에도 "Authorization"이 포함되어야 합니다. 그렇지 않으면 요청이 실패합니다

    회신하다
    0
  • 취소회신하다