오늘 온라인에서 문제를 발견했습니다. 온라인 이미지 도메인 이름의 경우 CDN 캐시가 프런트 엔드에 추가되었습니다. 캐시가 삭제되지 않으면 PHP를 사용하여 이미지 크기 조정을 동적으로 구현합니다. PHP로 처리한 결과가 출력될 때마다 오류가 발생합니다. 백엔드에서 읽으려면 백엔드 서버의 부담이 순간적으로 증가합니다. 분석 결과 PHP에는 304 처리가 없는 것으로 나타났습니다. HTTP의 경우는 서버에 요청할 때마다 수정 여부를 감지하고, 수정 사항이 없으면 직접 304 상태 코드를 반환하여 클라이언트의 캐시를 사용하는 것이 CDN의 원칙입니다. 304를 설정하면 해당 URL이 캐시됩니다.
관련 코드는 다음과 같습니다.
//检测有没改变 if (isset($_SERVER['HTTP_IF_NONE_MATCH'])){ $etag = $_SERVER['HTTP_IF_NONE_MATCH']; if (md5($this->image) === $etag){ header("HTTP/1.1 304 Not Modified"); exit; } } header("Last-Modified: " . gmdate("D, d M Y H:i:s", strtotime('2011-1-1'))." GMT"); //输出etag头 header('etag:' . md5($this->image)); header('Cache-Control:max-age=2592000');echo $this->image;
그 중 http 헤더 HTTP_IF_NONE_MATCH 일반적으로 서버에서 반환된 특정 URL의 식별입니다. 일반적으로 MD5를 사용하여 계산되므로 MD5 값 쌍을 감지할 수 있습니다. 아니요, 동일하면 304를 반환합니다. 오랫동안 패키지를 집었고 서버에서 반환된 Etag 레이블만 보았지만 클라이언트의 http 헤더에 If-None-Match가 표시되지 않아 fastcgi를 사용할 수 없었습니다. 다음을 추가하세요. .conf.default에 대한 코드:
코드는 다음과 같습니다.fastcgi_param CACHE_ETAG $http_if_none_match;