2017-05-16 2 views
0

요청합니다니스 : 옵션을 캐싱/CORS는 <a href="https://varnish-cache.org/docs/4.1/users-guide/vcl-hashing.html" rel="nofollow noreferrer">documentation</a>에 명시된 바와 같이, 해시 키가 <code>Host</code> 헤더 또는 <code>IP</code> 및 요청의 <code>URL</code> 기준으로 계산됩니다

sub vcl_hash { 
    hash_data(req.url); 
    if (req.http.host) { 
     hash_data(req.http.host); 
    } else { 
     hash_data(server.ip); 
    } 
    return (lookup); 
} 

어떻게 것 HTTP OPTIONS에 대한 올바른 캐시 구성 같은 URL, Host 또는 IP이 해당 HTTP GET 요청과 동일하게 보이는지 확인하십시오.

curl -H "Origin: https://www.example.com" -I \ 
    -H "Access-Control-Request-Method: GET" \ 
    -X OPTIONS --verbose \ 
    https://backend.server.example/rest/endpoint 

는 바람직 또한 CORS 요청의 일부인 Origin 헤더를 존중 응답을 캐시하는 것이다.

답변

1

다음을 시도해보십시오.

당신은 built-in VCLvcl_recv가 전혀 실행되지 않도록 당신의 vcl_recv 절차에서 return 문을 호출해야합니다, OPTIONS 요청 방법이 전혀 캐시 할 수 있는지 확인합니다. 캐시가 원산지 헤더 값에 따라 다른 것으로 들어, 이런 식으로 뭔가를 넣어 것입니다

sub vcl_recv { 
    if (req.method == "PRI") { 
    /* We do not support SPDY or HTTP/2.0 */ 
    return (synth(405)); 
    } 
    if (req.method != "GET" && 
     req.method != "HEAD" && 
     req.method != "PUT" && 
     req.method != "POST" && 
     req.method != "TRACE" && 
     req.method != "DELETE") { 
     /* Non-RFC2616 or CONNECT which is weird. */ 
     return (pipe); 
    } 

    if (req.method != "GET" && req.method != "HEAD" && req.method != "OPTIONS") { 
     /* We only deal with GET and HEAD by default */ 
     return (pass); 
    } 
    if (req.http.Authorization || req.http.Cookie) { 
     /* Not cacheable by default */ 
     return (pass); 
    } 
    if (req.method == "GET" || req.method == "HEAD" || req.method == "OPTIONS") { 
     set req.http.x-method = req.method; 
    } 
    return (hash); 
} 
sub vcl_backend_fetch { 
    set bereq.method = bereq.http.x-method; 
} 

:

sub vcl_hash { 

    if (req.http.Origin) { 
     hash_data(req.http.Origin); 
    } 
    # no return here in order to have built-in.vcl do its default behavior of also caching host, URL, etc. 
} 
+0

가 나는 것을 시도했다, 그러나 그것은 가능 캐시 것처럼 보인다 그리고 일부 변경 'OPTIONS' 요청은 어떻게 든'GET' 백엔드 페치로 변환됩니다. 따라서 백엔드를 직접 치는 것과 비교하여 바니시를 통해 요청을하면 헤더가 달라집니다. 어떤 생각? – mana

+1

Varnish는 당신이''''''vcl_recv''를''반환 (해쉬) '할 때 요청을''GET''으로 변환하는 것처럼 보입니다 ... 나는 그것을 우회하는 트릭으로 대답을 업데이트 할 것입니다. . –