相关疑难解决方法(0)

我想与304响应一起发送哪些标头?

当我发送304响应时.浏览器将如何解释我与304一起发送的其他标头?

例如

header("HTTP/1.1 304 Not Modified");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT");
Run Code Online (Sandbox Code Playgroud)

这是否会确保浏览器不会发送另一个有条件的GET请求(也没有任何请求),直到$ offset时间"用完"?

另外,其他标题呢?

我应该像304一样发送这样的标题:

header('Content-Type: text/html');
Run Code Online (Sandbox Code Playgroud)

我必须发送:

header("Last-Modified:" . $modified);
header('Etag: ' . $etag);
Run Code Online (Sandbox Code Playgroud)

为确保浏览器在下次$ offset已"用完"时发送条件GET请求,或者只是保存旧的Last Modified和Etag值?

发送304响应标头时是否还有其他事项需要注意?

php get http-headers http-status-code-304

16
推荐指数
2
解决办法
7643
查看次数

我在PHP中实现HTTP条件获取答案是否正常?

经过大量搜索,阅读我发现的每一个教程并在这里提出一些问题后,我终于设法回答了if-none-match和if-modified-自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);
Run Code Online (Sandbox Code Playgroud)

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

我的一个大问题是回答"304 Not Modified"到if-none-match和if-modified-since,因为HTTP请求只在需要时.

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

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

$ifNoneMatch = array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER) ? $_SERVER['HTTP_IF_NONE_MATCH'] : …
Run Code Online (Sandbox Code Playgroud)

php caching header http http-headers

8
推荐指数
1
解决办法
2630
查看次数

HTTP中的if-none-match和if-modified-since以及304澄清

我的问题是关于怎么回复一个HTTP 304"未修改"当我收到这两个如果,没有匹配,并从代理/客户端请求,如果-,因为修改.

来自RFC 2616第14.26节(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26):

如果没有任何实体标签匹配,则服务器可以执行所请求的方法,就像If-None-Match头字段不存在一样,但是也必须忽略请求中的任何If-Modified-Since头字段.也就是说,如果没有实体标签匹配,那么服务器绝不能返回304(未修改)响应.

我不太明白这个说法......

  1. "如果在PHP中没有任何实体标签匹配"他们会$_SERVER['HTTP_IF_NONE_MATCH']说我之前发送的ETag吗?
  2. 如果我正确理解了这个陈述,只要没有列出的ETag $_SERVER['HTTP_IF_NONE_MATCH']匹配我的ETag,我就会停止所有验证并正常提供页面.

任何人都可以用伪代码(或PHP代码)翻译这个RFC部分和/或回答我的2分以上?

编辑1: 谢谢St.Woland的回答.你(或其他任何人)可以告诉我这些6点是否正确:

  1. 格式$_SERVER['HTTP_IF_NONE_MATCH']可以是:

    a)If-None-Match:"xyzzy","r2d2xxxx","c3piozzzz"

    b)如果 - 无匹配:"xyzzy"

    并不是:

    c)If-None-Match:"xyzzy,r2d2xxxx,c3piozzzz"

  2. 如果!array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER),anyTagMatched()返回NULL.

  3. 只要ETag $_SERVER['HTTP_IF_NONE_MATCH']匹配我的文档ETag,anyTagMatched()就会返回TRUE.

  4. 如果没有Etags $_SERVER['HTTP_IF_NONE_MATCH']匹配我的文档ETag,则anyTagMatched()返回FALSE.

  5. 如果$_SERVER['HTTP_IF_MODIFIED_SINCE']设置并匹配我的文档"上次修改"日期isExpired()返回FALSE,否则返回TRUE.

  6. 一旦anyTagMatched()返回TRUE,我发出304.如果anyTagMatched()返回NULL并isExpired()返回FALSE我可以发出304.在任何其他情况下,我正常服务我的页面(我也发布最新的Last-Modified和ETag标题).

php caching http http-1.1

8
推荐指数
1
解决办法
9930
查看次数