【发布时间】:2014-07-01 21:43:51
【问题描述】:
有没有办法查出网页被更改后经过了多长时间?
例如,
我有一个页面托管在:www.mywebsitenotupdated.com
有没有办法知道这个 HTML 页面是什么时候上传到服务器的?
我无法访问服务器;只是一个网页链接。
【问题讨论】:
有没有办法查出网页被更改后经过了多长时间?
例如,
我有一个页面托管在:www.mywebsitenotupdated.com
有没有办法知道这个 HTML 页面是什么时候上传到服务器的?
我无法访问服务器;只是一个网页链接。
【问题讨论】:
不,您无法仅通过访问页面就知道页面上次更新或上次更改或上传到服务器的时间(根据解释,这可能是三个不同的事情)。
服务器可以并且应该(根据 HTTP 1.1 协议)发送Last-Modified header,您可以通过多种方式找到它,例如使用Rex Swain’s HTTP Viewer。但是,根据协议,这只是
“源服务器认为最后修改变体的日期和时间”。
并且协议实际上添加了:
“这个头域的确切含义取决于源服务器的实现和原始资源的性质。对于文件,它可能只是文件系统的最后修改时间。对于具有动态包含部分的实体,它可能是其组成部分的最后修改时间集合中的最新时间。对于数据库网关,它可能是记录的最后更新时间戳。对于虚拟对象,可能是最后一次内部状态发生变化。”
实际上,网页通常是通过内容管理系统或其他方式动态创建的,在这种情况下,Last-Modified 标头通常会显示创建响应的数据戳,这通常非常接近于请求。这意味着在这种情况下,标头实际上是无用的。
即使在“静态”页面的情况下(服务器只需选择与请求匹配的文件并将其发送),Last-Modified 日期戳通常也仅表示对服务器上文件的最后一次写入访问。这可能与文件从备份副本恢复的时间有关,或者文件在服务器上编辑而不对内容进行任何更改的时间,或者文件上传到服务器的时间,可能会替换旧的相同的副本。在这些情况下,假设时间戳在技术上是正确的,它表示页面未更改的时间(但不一定是上次更改的时间)。
【讨论】:
Last-Modified 标头是正确的,但是可以根据服务器对 HEAD 请求的响应以及对特定主机的服务器及其内容的了解以及它们的方式做出一些有根据的猜测生成它;窥探他们的页面并在连接上使用嗅探器可以发现很多信息。
打开浏览器控制台(?)并输入以下内容:
javascript:alert(document.lastModified)
【讨论】:
javascript:alert(document.lastModified) 不是实际日期
还有另一种查找页面更新的方法,这在某些情况下可能很有用(如果可行的话:)。
如果该页面已被 Google 或 Wayback Machine 编入索引,您可以尝试找出他们保存的日期(这些方法不适用于任何页面,并且有一些限制,在此 webmasters.stackexchange question's answers 中进行了广泛调查。但在许多情况下,它们可以帮助您找出页面更新日期:
Saved 6 times between June 7, 2014 and November 23, 2016.,您可以查看每个日期的所有已保存副本【讨论】:
要检查Last Modified 标头,您可以使用httpie (docs)。
pip install httpie --user
$ http -h https://martin-thoma.com/author/martin-thoma/ | grep 'Last-Modified\|Date'
Date: Fri, 06 Jan 2017 10:06:43 GMT
Last-Modified: Fri, 06 Jan 2017 07:42:34 GMT
Date 很重要,因为它报告的是服务器时间,而不是您的本地时间。此外,并非每个服务器都发送Last-Modified(例如,超级用户似乎不这样做)。
【讨论】:
这是a Pythonic way来做的:
import httplib
import yaml
c = httplib.HTTPConnection(address)
c.request('GET', url_path)
r = c.getresponse()
# get the date into a datetime object
lmd = r.getheader('last-modified')
if lmd != None:
cur_data = { url: datetime.strptime(lmd, '%a, %d %b %Y %H:%M:%S %Z') }
else:
print "Hmmm, no last-modified data was returned from the URL."
print "Returned header:"
print yaml.dump(dict(r.getheaders()), default_flow_style=False)
脚本的其余部分包括存档页面和检查新版本的更改以及通过电子邮件提醒某人的示例。
【讨论】: