我想在网页上检查文档的年龄,但它没有显示!这是 telnet 到服务器的结果:
telnet av.hostoi.com 80
Connected to av.hostoi.com.
HEAD / HTTP/1.0
HTTP/1.1 200 OK
Date: Tue, 23 Oct 2012 16:55:40 GMT
Server: Apache
X-Powered-By: PHP/5.2.17
Connection: close
Content-Type: text/html
Connection closed by foreign host.
在另一台服务器上还包含上面没有的以下两行:
Last-Modified: Fri, 17 Jun 2011 11:17:45 GMT
ETag: "2ce392-b1-4a5e688eae840"
因此我在互联网上搜索,据我所知,apache 中应该有一个配置可以在 htaccess 中设置 headers 和 etag?但我找不到任何显示该信息的地方。
如果有帮助的话,这里是 apache 中加载的模块:
核心 mod_authn_file mod_authn_default mod_authz_host mod_authz_groupfile mod_authz_user mod_authz_default mod_auth_basic mod_include mod_filter mod_log_config mod_env mod_expires mod_headers mod_setenvif mod_version prefork http_core mod_mime mod_status mod_autoindex mod_asis mod_info mod_vhost_alias mod_negotiation mod_dir mod_actions mod_alias mod_rewrite mod_so mod_php5 mod_ruid2
据我所知,必须启用 mod_header,这似乎是事实?
编辑:尝试了建议的解决方案:将 .htaccess 文件放在 / 文件夹中,即使有一个名为“请勿在此处上传”的文件。.htaccess 的内容:
#Do not remove this line, otherwise mod_rewrite rules will stop working
RewriteBase /
Options -Indexes
SSILastModified on
<IfModule mod_expires.c>
FileETag MTime Size ExpiresActive on
ExpiresDefault "access plus 10 days"
ExpiresByType application/javascript "access plus 1 week" ExpiresByType application/x-javascript "access plus 1 week" ExpiresByType application/x-shockwave-flash "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/x-icon "access plus 6 month"
ExpiresByType image/ico "access plus 6 month"
</IfModule>
我将此文件放在 public_html 文件夹和包含文件 update.ver 的子文件夹 nod_update3 中。然后我执行检查文档年龄的脚本,如下所示:
./check_http -H av.hostoi.com -u /nod_update3/update.ver -M 2d
HTTP CRITICAL: HTTP/1.1 200 OK - Document modification date unknown - 26316 bytes in 0,159 second response time |time=0,158965s;;;0,000000 size=26316B;;;0
如您所见,尽管 ftp 客户端显示最后修改时间为 2012 年 10 月 25 日,但没有显示修改日期
我尝试检查同一文件夹中的另一个文件,如下所示:
./check_http -H av.hostoi.com -u /nod_update3/em000_32_l0.nup -M 2d
HTTP CRITICAL: HTTP/1.1 200 OK - Last modified 13,5 days ago - 56472 bytes in 1,059 second response time |time=1,059014s;;;0,000000 size=56472B;;;0
srvmon plugins #
如您所见,修改日期是已知的。那么 ver 文件为什么会出现问题?您可以在此 URL 中检查该文件:http://av.hostoi.com/nod_update3//update.ver
答案1
X-Powered-By: PHP/5.2.17
看起来该页面是由 PHP 生成的,在这种情况下,Apache 不知道 Last Modified tamestamp。在这种情况下,PHP 脚本负责设置标Last-Modified
头,但它显然没有这样做。
如果这些只是静态文件,那么您可能希望配置 Apache 以直接为它们提供服务,而不是通过 PHP 脚本为它们提供服务。如果它们不是静态文件,那么您需要修复 PHP 脚本以Last-Modified
正确设置标头。
答案2
通过追溯Apache的源代码,我们可以看到这种错误配置的根本原因是“Xbithack Full”启用的语义隐式覆盖了“SSILastModified On”启用的语义。
if (conf->lastmodified > 0) {
... {
ap_update_mtime(r, r->finfo.mtime);
ap_set_last_modified(r);}}
else if (((conf->xbithack == XBITHACK_FULL ||
(conf->xbithack == XBITHACK_UNSET &&
DEFAULT_XBITHACK == XBITHACK_FULL))
...)) {
ap_update_mtime(r, r->finfo.mtime);
ap_set_last_modified(r);
}
因此,一个可能的解决方案是将“SSILastModified on”更改为“XBitHack full”。
答案3
我们终于换了一家新的托管服务提供商,现在一切都正常了。谢谢你的帮助,祝你圣诞快乐。以下是检查结果。
srvmon plugins # ./check_http -H baza32.info -u /nod_update3/update.ver -M 3d
HTTP OK: HTTP/1.1 200 OK - 26168 bytes in 0,219 second response time |time=0,218608s;;;0,000000 size=26168B;;;0