gpt4 book ai didi

php - 我在 PHP 中实现 HTTP Conditional Get answers 可以吗?

转载 作者:可可西里 更新时间:2023-11-01 12:26:22 25 4
gpt4 key购买 nike

在大量搜索、阅读我找到的所有教程并在这里提出一些问题之后,我终于成功地(至少我认为)正确地回答了 if-none-match 和 if-modified-since HTTP 请求。

快速回顾一下,这是我对可缓存的每个页面所做的:

session_cache_limiter('public'); //Cache on clients and proxies
session_cache_expire(180); //3 hours
header('Content-Type: ' . $documentMimeType . '; charset=' . $charset);
header('ETag: "' . $eTag . '"'); //$eTag is a MD5 of $currentLanguage + $lastModified
if ($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);

此外,每个页面都有自己的 URL(适用于每种语言)。例如,“index.php”将在英语的 URL“/en/home”和法语的“/fr/accueil”下提供。

我的大问题是对 if-none-match 和 if-modified-since HTTP 请求仅在需要时回答“304 Not Modified”。

我找到的最好的文档是: http://rithiur.anthd.com/tutorials/conditionalget.php

这是我做的实现(这段代码在可缓存的页面上称为ASAP):

$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();
}
}

我的问题有两个:

  • 这是正确的做法吗?我的意思是发送if-none-match和if-modified-since时,both必须匹配才能回答304,如果只发送两者之一,只匹配这个就可以发送304?
  • 在此处描述的上下文中使用时,这 2 个片段是否对公共(public)缓存友好(我的意思是在代理网络浏览器上缓存友好)?

顺便说一句,我只使用 PHP 5.1.0+(我不支持低于该版本的版本)。

编辑:增加赏金......我期待高质量的答案。如果您在猜测什么,请不要回答/投票!

最佳答案

下面是可能有用的函数:

function isModified($mtime, $etag) {
return !( (
isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
&&
strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mtime
) || (
isset($_SERVER['HTTP_IF_NONE_MATCH'])
&&
$_SERVER['HTTP_IF_NONE_MATCH'] == $etag
) ) ;
}

我建议你看看下面这篇文章:http://www.peej.co.uk/articles/http-caching.html

更新:

[AlexV] Is is even possible to receive if-none-match AND if-modified-since at the same time?

您绝对可以同时设置两者。然而:

If none of the entity tags match, then the server MAY perform the requested method as if the If-None-Match header field did not exist, but MUST also ignore any If-Modified-Since header field(s) in the request. That is, if no entity tags match, then the server MUST NOT return a 304 (Not Modified) response.

RFC2616 #14.26

示例值(W 代表“弱”;在 RFC2616 #13.3.3 中阅读更多内容):

If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
If-None-Match: *

作为一种特殊情况,值“*”匹配资源的任何当前实体。

关于php - 我在 PHP 中实现 HTTP Conditional Get answers 可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2021882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com