可以请求的HTTP标头检查网页已通过查看它的日期,但如何对动态页面,如编辑 - PHP,ASPX - 从数据库中获取数据?我可以利用“HTTP标头”检查一个动态页面已被更改
回答
你可以正确使用http响应头,但它经常被忽略。
否则存储内容的本地MD5哈希可能对你有用的(除非有,你可以勾了一个更简单的内容中的字符串)。这并不理想(因为这是一个相当缓慢的过程),但它是一种选择。
是的,您可以并应该使用HTTP标头将页面标记为未过期。如果它们是动态的(PHP,ASPX等)和/或数据库驱动,则需要手动控制设置Expires标头/发送HTTP Not Modified。 ASP.NET有一些SqlDependency对象,但它们仍需要配置和管理。 (不知道PHP有东西只是喜欢它,但可能有一些在PEAR如果不...)
这是ETag头的确切目的,但它必须由你的web框架或支持您需要注意您的应用程序正确响应带有标题的请求如果 - 匹配,如果不匹配和如果 - 范围(请参阅HTTP Ch 3.11)。
的Last-Modified
头只会对你有用的,如果该网站的程序员已明确将其归还。
对于常规的,静态Last-Modified
页面的HTML文件的最后修改的时间戳。对于动态生成的页面,服务器无法可靠地分配Last-Modified
值,因为它根本不知道如何根据请求更改内容,所以很多服务器根本不会生成标题。
如果你有在页面控件,然后确保最后修改头被设置将确保Last-Modified
检查是成功的。否则,您可能需要获取页面,并执行正则表达式来查找更改后的部分(例如新闻网站标题中的日期/时间)。如果没有这样明显的标记存在,那么我会在页面内容上第二个Oli's suggestion作为一种确定它已经改变的方式。
即使你可能会认为这是过时的我总是发现西蒙·威利森对Conditional GET文章比有用的多。这个例子是在PHP中,但它很简单,你可以适应其他语言。这是例子:
function doConditionalGet($timestamp) {
// A PHP implementation of conditional get, see
// http://fishbowl.pastiche.org/archives/001132.html
$last_modified = substr(date('r', $timestamp), 0, -5).'GMT';
$etag = '"'.md5($last_modified).'"';
// Send the headers
header("Last-Modified: $last_modified");
header("ETag: $etag");
// See if the client has provided the required headers
$if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ?
stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) :
false;
$if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ?
stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) :
false;
if (!$if_modified_since && !$if_none_match) {
return;
}
// At least one of the headers is there - check them
if ($if_none_match && $if_none_match != $etag) {
return; // etag is there but doesn't match
}
if ($if_modified_since && $if_modified_since != $last_modified) {
return; // if-modified-since is there but doesn't match
}
// Nothing has changed since their last request - serve a 304 and exit
header('HTTP/1.0 304 Not Modified');
exit;
}
有了这个,你可以使用HTTP动词GET或HEAD(我认为这也可能与others,但我看不到的原因使用它们)。您需要做的只是将If-Modified-Since
或If-None-Match
与由页面的先前版本发送的标头Last-Modified
或ETag
的相应值相加。从HTTP 1.1版开始,建议使用ETag
而不是Last-Modified
,但两者都会完成这项工作。
这是条件GET如何工作的一个非常简单的例子。首先,我们需要检索的页面通常的方式:
GET /some-page.html HTTP/1.1 Host: example.org
有条件的标题和内容首度回应:
200 OK ETag: YourETagHere
现在有条件的GET请求:
GET /some-page.html HTTP/1.1 Host: example.org If-None-Match: YourETagHere
和表示响应您可以使用页面的缓存版本,因为只有标题即将交付:
304 Not Modified ETag: YourETagHere
通过此服务器通知您,页面没有修改。
我还可以推荐另一篇关于条件GET的文章:HTTP conditional GET for RSS hackers。
- 1. 我可以自动更改个人头像吗? - 此页面可以
- 2. 我可以使用Spring Security @PreAuthorize检查HTTP标头吗?
- 3. HTTP标头没有被更改:yii2
- 4. 无法检索一个页面的完整http标头
- 5. 用于缓存动态页面的Http标头
- 6. 可见页面上的HTTP标头404
- 7. liferay动态更改页面标题
- 8. 检查网页是否已被修改
- 9. 我可以检查prePersist()中的值是否已更改?
- 10. 检查是否已经定义了某个HTTP标头
- 11. 动态更改页面
- 12. 更改http请求标头
- 13. 检测页面已被访问更改图像
- 14. 我是否可以动态更改页面布局以适应窗口大小?
- 15. 页面检查报告说,外部文件已被修改
- 16. 我需要使用ajax动态更改页面的一部分
- 17. 检测页面更改为一个页面应用程序JS
- 18. 我该如何动态更改页面的标题:
- 19. 使用Javascript从h1标签动态更改页面标题
- 20. 检查一个字符串是否以http开头使用Javascript
- 21. 改变页面在一个UIWebView动态
- 22. 您正在查找的页面可能已被删除名称已更改或暂时不可用
- 23. 我可以检查某个页面是否在某个Facebook标签内?
- 24. 我可以动态更改嵌套母版页的母版吗?
- 25. 可以jQuery的对话框模态更改页面内模态?
- 26. 任何一个可以告诉我,我怎么可以从这个$ HTTP头
- 27. 我可以创建一个原型页面,然后用PHP更改它?
- 28. 如何检查动态网页是否已更新?
- 29. jQuery Mobile 1.4.0:动态更改页面的标题和标题
- 30. HTTP头可以被本地化吗?
建议的解决方案是否适合您? – 2009-01-10 13:44:08