Is my implementation of HTTP Conditional Get answers in PHP is OK?

.v0id

New Member
After searching a lot, reading every tutorials I've found and asking some questions here, I've finally managed to answer corrctly (at least I think) to if-none-match and if-modified-since HTTP requests.To do a quick recap, this is what I do on every pages cacheable:\[code\]session_cache_limiter('public'); //Cache on clients and proxiessession_cache_expire(180); //3 hoursheader('Content-Type: ' . $documentMimeType . '; charset=' . $charset);header('ETag: "' . $eTag . '"'); //$eTag is a MD5 of $currentLanguage + $lastModifiedif ($isXML) header('Vary: Accept'); //$documentMimeType can be either application/xhtml+xml or text/html for XHTML (based on $_SERVER['HTTP_ACCEPT'])header('Last-Modified: ' . $lastModified);header('Content-Language: ' . $currentLanguage);\[/code\]Also, every page have it's own URL (for every languages). For example, "index.php" will be served under URL "/en/home" in English and "/fr/accueil" in French.My big problem was to answer a "304 Not Modified" to if-none-match and if-modified-since HTTP requests only when needed.The best doc I've found is:http://rithiur.anthd.com/tutorials/conditionalget.phpAnd this is the implementation I did of it (this piece of code is called ASAP on pages that can be cached):\[code\]$ifNoneMatch = array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER) ? $_SERVER['HTTP_IF_NONE_MATCH'] : false;$ifModifiedSince = array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false;if ($ifNoneMatch !== false && $ifModifiedSince !== false){ //Both if-none-match and if-modified-since were received. //They must match the document values in order to send a HTTP 304 answer. if ($ifNoneMatch == $eTag && $ifModifiedSince == $lastModified) { header('Not Modified', true, 304); exit(); }}else{ //Only one header received, it it match the document value, send a HTTP 304 answer. if (($ifNoneMatch !== false && $ifNoneMatch == $eTag) || ($ifModifiedSince !== false && $ifModifiedSince == $lastModified)) { header('Not Modified', true, 304); exit(); }}\[/code\]My question is two fold:
  • Is it the correct way to do it? I mean when if-none-match and if-modified-since are sent, both must match to answer a 304, and if only one of the two is sent, only matching this one is OK to send a 304?
  • When used in the context described here, is these 2 snippets are public cache friendly (I mean cache friendly on proxies and Web browsers)?
BTW, I use PHP 5.1.0+ only (I don't support versions lower that that).Edit: Added bounty... I expect quality answer. Don't answer/vote if you are guessing something!
 
Back
Top