2011-02-23 2 views
4

나는 Ajax 요청 여부에 따라 캐시 가능한 콘텐츠를 제공하려고합니다.PHP/Ajax "Vary : X-Requested-With"가 저를 위해 작동하지 않습니다!

시나리오 :

약간의 PHP 스크립트 "/test.php는"일부 HTML 출력을 제공하며 설정 다음 헤더 :

Expires   Wed, 23 Feb 2011 13:30:06 GMT 
Cache-Control public, max-age=60 
Vary   X-Requested-With,Accept-Encoding 

출력이 $_SERVER['HTTP_X_REQUESTED_WITH'] 상태에 따라 달라집니다.

내 Firefox가 URL을 가리키면 출력이 나오고 다음 분 동안 브라우저 캐시와 동일한 결과를 얻습니다. 서버를 치지 않습니다. 좋아, 지금까지.

XMLHttpRequest (X-Requested-With: XMLHttpRequest 헤더 포함)을 통해 동일한 리소스를 요청하면 내 Firefox는 서버를 요청하지 않지만 캐시의 (잘못된) 응답을 제공합니다!

다른 방법으로는 동일합니다. 자원의 Ajax 호출이 캐시를 채우고 후속 브라우저 요청은 캐시의 (잘못된) 응답을 제공합니다.

누구든지이 주제에 대한 경험이 있습니까? 나는 이것이 공통된 문제가되어야한다고 생각한다 - 같은 URL에서 아약스 여부에 따라 콘텐츠를 제공한다.

인사, Ilja

+0

Firefox는 초기 Ajax 요청을 보내지도 않습니까? – Gumbo

답변

0

나는이 문제를 재현 할 수 있습니다,하지만 난 포함하지 않는 경우에만 X-요청-로 아약스 응답 헤더입니다. ajax 호출에 대한 헤더를 설정하면 이 대부분으로 예상대로 작동하지만 ajax 호출은 일반 요청에 대한 캐시를 지우지 만 그 반대의 경우에도 콘텐츠는 캐시되지 않지만 결코 잘못된 내용을 얻지는 않습니다.

<? 
    putenv('TZ=PST8PDT'); 
    date_default_timezone_set('America/Los_Angeles'); 

    header('Expires: '.gmdate("D, d M Y H:i:s").' GMT'); 
    header('Cache-Control: public, max-age=60'); 
    header('Vary: X-Requested-With,Accept-Encoding'); 

    echo 'it is now '.date('Y-m-d H:i:s'); 
?> 

그리고이 같은 테스트 페이지 :

내 PHP의 문서는 다음과 같습니다

<a href="resource.php" target="ifr">load into frame</a><br /> 
<iframe name="ifr" width="400" height="100"></iframe> 

<hr /> 

<a href="#" onclick="return load();">load into div via ajax</a><br /> 
<div id="di" style="border: 1px solid black; width: 400px; height: 100px;"></div> 

<script> 

function load(){ 

    var req = new XMLHttpRequest(); 
    req.onreadystatechange = function(){ 

     if (req.readyState == 4){ 
      document.getElementById('di').textContent = req.responseText; 
     } 
    } 

    req.open('GET', 'resource.php', 1); 
    req.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
    req.send(null); 

    return false; 
} 

</script> 

내가 처음 링크를 공격, 서버에서 요청합니다. 내가 다시 때렸을 때, 캐시에서 온다. 이후의 모든 클릭은 캐시에서 최대 60 초가됩니다.

두 번째 링크를 클릭하면 요청이 서버로 전송됩니다. 내가 다시 때렸을 때, 캐시에서 온다. 이후의 모든 클릭은 캐시에서 최대 60 초가됩니다.

링크 1을 누른 다음 링크 2를 누르면 모두 서버로 이동합니다. 그런 다음 링크 1을 다시 누르면 서버로 다시 이동합니다 (잘못된 것입니다). 데모 순서 (모두 60 내 가정) :

Reg : server 
Reg : cache 
Reg : cache 
Reg : cache 
Ajax : server 
Ajax : cache 
Reg : server 
Ajax : server 

결말은 당신이 아약스를 통해 제공 할 때까지 안정적으로 캐시 것을 다르게, 아약스 요청을 다른 URL을 사용하려는 경우이다 (아약스 = 1이 잘 작동 것).

FF 4.0에서 테스트 중입니다.

+0

x-requested-with는 동일한 URL에서 ajax 요청을 식별하는 데 필수입니다. RESTFUL 인터페이스에 따라 동일한 URL에 다른 콘텐츠를 제공하고 싶습니다. – Ilja

+0

그리고 대답은 ... 할 수 있지만 올바르게 캐시되지는 않습니다.데모 코드가 예상대로 작동하지 않습니까? – Cal

관련 문제