什么是Etag? 在HTTP1.1中有介绍,主要的作用就是在(css file, image, javascript file)文件后面添加一个唯一的参数(相当于查询参数字符串),Etag有服务器端生成,并且随着文件的改变而改变,这样浏览器端就会只重新请求获取Etag发生变化的文件,减少浏览器端数据的流量,如果Etag没有变化,浏览器就会直接读取本地缓存,以加快浏览器的反应速度,重要的是减轻服务器端的压力,所以服务器端Etag的实现就比较重要了。 对于Apache和Lighttpd中怎样配置Etag,网上的文章很多,但对于IIS就没那么走运了, 只能写个ISAPI Filter来解决。 对于单台WEB服务器而言,就没有必要设置了,但对于使用了负载均衡机制,每台WEB服务器都会返回各自的Etag,实在比较讨厌。没有办法,最好的办法是去掉Etag了。 主要的代码如下: #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <httpfilt.h>
DWORD DoSendResponse( HTTP_FILTER_CONTEXT * pfc, HTTP_FILTER_SEND_RESPONSE * pResponse );
BOOL WINAPI __stdcall GetFilterVersion(HTTP_FILTER_VERSION *pVer) { pVer->dwFlags = ( SF_NOTIFY_ORDER_LOW | SF_NOTIFY_SEND_RESPONSE ); pVer->dwFilterVersion = HTTP_FILTER_REVISION; strcpy(pVer->lpszFilterDesc, "Remove ETAG Header ISAPI filter, Version 1.0"); return TRUE; }
DWORD WINAPI __stdcall HttpFilterProc(HTTP_FILTER_CONTEXT *pfc, DWORD NotificationType, VOID *pvData) { switch (NotificationType) { case SF_NOTIFY_SEND_RESPONSE :
return DoSendResponse( pfc, (HTTP_FILTER_SEND_RESPONSE *) pvData ); default : break; } return SF_STATUS_REQ_NEXT_NOTIFICATION; }
DWORD DoSendResponse( HTTP_FILTER_CONTEXT * pfc, HTTP_FILTER_SEND_RESPONSE * pResponse ) { BOOL fRes = TRUE; DWORD dwError;
fRes = pResponse->SetHeader( pfc, "ETAG:", "" );
if ( !fRes ) { dwError = GetLastError(); pfc->pFilterContext = (LPVOID)(DWORD64)pResponse->HttpStatus; } return SF_STATUS_REQ_NEXT_NOTIFICATION; }
注意编译好之后的dll要给IIS_WPG账号适当的权限, 不然IIS加载不了这个dll。
以下是电影网的yslow截图
(责任编辑:admin) |