2017-10-13 3 views
0

WordPress API를 쿼리 할 때 원본 헤더를 캐싱한다고 생각되는 문제가 있습니다. 그러나 나는 무슨 일이 일어나고 있는지, 어떻게 해결할 수 있는지 정확히 고민하고있다.액세스 제어 허용 - 원본 및 캐싱 이해

첫째 - 여기서 무슨 일이 일어나고있는 작업은 다음과 같습니다

내가 아약스를 통해 WP API 메뉴 플러그인에 의해 추가 된 워드 프레스 API와 특히 엔드 포인트를 조회하는 허브 스팟 (HubSpot) 페이지가 - 나는 다음 메뉴를 만들도록하여 워드 프레스 업데이트 할 때 클라이언트 (또는 마케팅 팀 중 하나) - 메뉴가 HubSpot 페이지에서도 업데이트됩니다.

허브 스팟 (HubSpot) 페이지는 워드 프레스 사이트의 하위 도메인에 있고, 처음에 워드 프레스 사이트는 Access-Control-Allow-Origin은 단지 하위 도메인의 URL을 명시 적으로 설정하여 추가 헤더를 가지고 있었다.

HubSpot에서 편집 화면을 탐색하면 기본 메뉴가로드되지 않지만 두 번째 호출 (다른 메뉴에 대한)이 성공합니다. 다음 메인 메뉴 오류 :

'액세스 제어를 허용-출처'헤더 제공된 원점 같지 않은 값 'http://subdomain.example.com'를 갖는다. 따라서 'https://preview.hs-sites.com'은 액세스가 허용되지 않습니다.

http://subdomain.example.com은 실제 페이지의 URL입니다. 이상하게도 미리보기 페이지의 실제 URL은 https://preview.hs-sites.com이 아니지만 아마 미리보기가 iframe에서로드되기 때문일 수 있습니다.

이제 실제 URL로 이동하면 동일한 문제가 발생합니다. 첫 번째 호출 오류는 발생하지만 두 번째 오류는 성공합니다. 오류로 이번에는 다음과

'액세스 제어를 허용-출처'헤더 제공된 원점 같지 않은 값 'https://preview.hs-sites.com'를 갖는다. 따라서 'http://subdomain.example.com'은 액세스가 허용되지 않습니다.


질문 1 - 기원이 워드 프레스 사이트에서 캐시 된 때문이다?

add_filter('allowed_http_origins', 'my_add_origins'); 
function my_add_origins($origins) { 
    $origins[] = 'https://preview.hs-sites.com'; 
    $origins[] = 'http://subdomain.example.com'; 
    return $origins; 
} 

질문 2 : 다음과 같이 -

내가 지금 allowed_http_origins 워드 프레스 내에서 필터에 모두 http://subdomain.example.comhttps://preview.hs-sites.com을 추가 한에 관계없이 추정 캐싱 - 왜 허용 https://preview.hs-sites.com 아니다 에 허용 된 원산지가 추가 된 경우?

add_action('rest_api_init', function() { 
    remove_filter('rest_pre_serve_request', 'rest_send_cors_headers'); 
    add_filter('rest_pre_serve_request', function($value) { 
     $domains = [ 
      'https://preview.hs-sites.com', 
      'http://subdomain.example.com' 
     ]; 
     $allowed = get_http_origin(); 
     if ($allowed && (in_array($allowed, $domains))) { 
      header("Access-Control-Allow-Origin:" . esc_url_raw($allowed)); 
     } elseif (!$allowed) { 
      header("Access-Control-Allow-Origin: http://subdomain.example.com"); 
     } 
     header('Access-Control-Allow-Methods: GET'); 

     return $value; 
    }); 
}); 

그러나 동일한 오류가 발생합니다 - 나는 위의 기능을 테스트하는 방법을 확신했다

그래서 나는 또한 다음 시도했다.

질문 3 : 누군가가이 상황에서 장소 소요 어떤 오류를 말하는 과정을 설명시겠습니까 - 특히 그들이에서 자신의 가치를 얻고있는 곳 - 기원은 현재 페이지입니다? 그리고 'Access Control-Allow-Origin'헤더의 값이 '... - 이 값은 WordPress의 Access-Control-Allow-Origin 헤더로 설정되어 있어도 올바르게 설정되어 있습니까?

참고는 또한 아약스 요청에 노 캐시 헤더를 설정했지만, 때문에 프리 플라이트 요청이 오류가 발생합니다. 요청에 무작위 쿼리 문자열을 추가 했으므로 효과가 없습니다.

보안상의 이유로 Access-Control-Allow-Origin 헤더로 와일드 카드 값을 추가하지 마십시오. 그리고 무슨 일이 일어나고 있는지 정말 알고 싶습니다!

답변

1

서버 응답에 Origin 값을 가진 Vary 응답 헤더를 추가해보십시오.

캐시를 생략하고 Origin 요청 헤더의 값이 그것에서 캐시 요청의 Origin 값과 다른 경우 새 네트워크 요청을하려면 브라우저를 유발하는 효과를 가지고 있어야

.

자세한 내용은 the MDN article on the Vary response header을 참조하십시오.

Vary HTTP 응답 헤더는 캐시 된 응답이 원본 서버에서 새로운 하나를 요청 보다는 사용할 수 있는지 여부를 결정하는 미래의 요청을 헤더와 일치하는 방법을 결정합니다. 콘텐츠 협상 알고리즘에서 리소스 표현을 으로 선택할 때 사용 된 헤더를 표시하기 위해 서버에서 사용됩니다.

관련 문제