So Tired !_! 逆水行舟, 不进则退!

15Sep/17

nginx自定义header的坑

Posted by Nick Xu

原来是对header name的字符做了限制,默认 underscores_in_headers 为off,表示如果header name中包含下划线,则忽略掉。
恰好我自定义的header中都是用的下划线。
处理办法:
1:配置中http部分 增加underscores_in_headers on; 配置
2:用减号-替代下划线符号_,避免这种变态问题。nginx默认忽略掉下划线可能有些原因。
Tagged as: , Comments Off
26Jul/12

解决IIS7返回header里面的date值不正确导致firefox里cookies无效的问题.

Posted by Nick Xu

问题:

突然有一天,easybug.net上的登录功能无法使用,原本以为是自己电脑有问题,所以没有理会.后来又有好些用户反应无法登录.我就奇怪了,最近都没有更新过什么,怎么会突然就登录不了了呢.

用了很多方法都没有查到具体的原因,后来因为我点击切换语言的时候,发现这个功能也失效了.所以大致的原因可以锁定在cookies上了.用firebug上的net和cookies模块来监控http请求和cookies的值,发现在net里面是有带了cookies,但是在cookies标签里却看不到系统创建的cookies,就是说浏览器没有把cookies写入到浏览器里面,查了半天没找到什么原因,太神奇了...

后来想想既然在net标签里都已经有cookies信息了,那浏览器应该也是收到的了,会不会是在header里有什么问题呢?果然,看到一个很奇特的信息,在header里面看到这么一行信息:

date:2013-7-25 19:32:28

奇怪了,怎么日期是2013年呢,现在才2012年呢...于是顺藤摸瓜,查一下http协议相关的资料,果然被我查到这样一篇内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Problem Description
 
W3SVC logs show incorrect time - stuck on the same time 2007-11-04 04:56:06
REPRO STEPS
 
    Changed the system time to a future time (e.g. 11th May 2020)
    Browsed any site - verified the log file created in the new date/time
    Changed the system time to be correct (today's date and time)
    Now, browsed any website and saw that the time on the log files is now stuck on 11th May 2020's time
 
RESOLUTION
 
    net stop http
    net start w3svc
 
OR
 
    net stop http
    net start http
    iisreset
 
You must restart the http service whenever you change the date in the server.
 
Verified in the code and confirmed that this is by design and you need to follow the above steps to make IIS logging the correct time.

 

大致的意思是在IIS上,如果修改了服务器当前的日期到2020年,然后访问服务器上的站点,日志文件会以当前日期来记录日志内容,此时再把服务器上的日期修改回正确的日期,再访问站点,日志文件里的日期还是2020年的日期,不会自动修改回来,要解决这种问题,只有重启IIS,而且还一定要重启http这个服务,不然不会有效果的.我按上面的步骤试了一下,再来看一下header里面的date,果然现在已经是正确的值了,试一下登录easybug.net,yeah!!登录成功了!!!

总结出现以上问题的原因来自几个方面:
1. 这算是IIS的一个小小的BUG,不过为何会出现日期不一至呢?大部分是人为的原因造成的.
2.各个浏览器里面,好像只有Firefox在IIS出现这种情况的时候有问题,其它浏览器没有问题.
3.通过设置cookies的失效时间大于header里面date的时间应该也可以解决这个问题,不过没有去测试.
4.百年一遇的情况,RP问题啊:(

 

25May/10

三种典型web服务器Header设置内容过期方法

Posted by Nick Xu

YSlow网页优化分析表示
设置过期的HTTP Header.设置Expires Header可以将脚本, 样式表, 图片, Flash等缓存在浏览器的Cache中.

方法:
一、Internet 信息服务 (IIS)的内容过期设置
如果IIS 网站中有时间敏感信息,可以配置设置来保证过期信息不被代理服务器或 Web 浏览器缓存。可以配置网站内容,使之在任
何的时间自动过期。当启用内容过期时,Web 浏览器将比较当前日期和截止日期,以便决定是显示缓存页还是从服务器请求更新的页
。Microsoft ASP.NET 这样的服务器端技术可用于动态更改提供的内容。通常,时间敏感信息只限于单个文件、目录或网站;不过,您也可以为某台计算机上的所有网站设置内容过期。
必须是本地计算机上 Administrators 组的成员或者必须被委派了相应的权限,才能执行下列步骤。作为安全性的最佳操作,请使用不属于 Administrators 组的帐户登录计算机,然后使用运行方式命令以管理员身份运行 IIS管理器
在命令提示符下,键入 runas /user:administrative_accountname "mmc %systemroot%system32inetsrviis.msc"。
设置网站内容的过期时间
1. 在 IIS 管理器中,展开本地计算机;右键单击要设置内容过期的网站、虚拟目录或文件,然后单击“属性”。
2. 单击“HTTP 头”选项卡。
3. 选中“启用内容过期”复选框。
4. 单击“立即过期”、“此时间段后过期”或“过期时间”,然后在对应的框中输入所需的过期信息。
5. 单击“确定”。
二、APACHE服务的内容过期设置
Apache配置摘录及解释
i. 过期相关设置
LoadModule headers_module modules/mod_headers.so
#Load 修改header的模块。
LoadModule expires_module modules/mod_expires.so
#Load 设定过期header的模块。
Header append Via: CCN-BJ-4-502
#增加一个Via header,值配置成设备的hostname。
KeepAliveTimeout 60
#设置连接的保持时间为60秒。
ExpiresActive On
#启用过期header功能。
ExpiresDefault A604800
#缺省过期时间为“访问后的604800秒”
<Directory /data/download>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
ExpiresByType text/html A300
#text/html类型文件的过期设置为“访问后的300秒”
ExpiresByType text/css A259200
#text/css类型文件的过期设置为“访问后的259200秒”
ExpiresByType application/x-javascript A300
# application/x-javascript类型文件的过期设置为“访问后的300秒”
ExpiresByType image/gif A2592000
#image/gif类型文件的过期设置为“访问后的2592000秒”
ExpiresByType application/x-shockwave-flash A2592000
# application/x-shockwave-flash类型文件的过期设置为“访问后的2592000秒”
</Directory>
上述配置文件中load的两个模块:mod_headers.so  和mod_expires.so 可以让Apache具有对header的一些定制功能。
ExpiresByType:     表示按照文件类型-MIME-TYPE设定过期策略;
A300: 表示在Access后300秒后过期;
ExpiresByType text/css A2592000:    表示Mime type是text/css的文件,在Access后2592000秒过期。
ExpiresDefault A604800:  表示除了单独制定的文件类型等过期策略外的其他内容,按照这个缺省的策略设定:访问后604800秒过期。
上面的方法可以实现根据web发布的不同文件类型,针对不同的发布目录进行过期策略设置。在按照如上方法设置后,Apache会自动的产生两个相关的 http header,举例如下:
HTTP/1.1 200 OK
Date: Tue, 27 Mar 2007 17:44:21 GMT
Server: Apache/2.0.54 (Unix)
Last-Modified: Thu, 25 Jan 2007 07:45:45 GMT
ETag: “72df3a-93-99499c40”
Accept-Ranges: bytes
Content-Length: 147
Cache-Control: max-age=2592000
Expires: Thu, 26 Apr 2007 17:44:21 GMT
Via: CCN-BJ-4-575
Keep-Alive: timeout=60, max=100
Connection: Keep-Alive
Content-Type: image/gif
Length: 147 [image/gif]
其中:Date + Max-age = Expires.  Max-age是个时间长度,对应web server上面设置的过期时间;Expires是根据max-age算出来的过期时间点,两者是一致的,不同cache在判断内容是否过期时会严格比较 系统时间和上述过期时间,或者比较age(在cache中存住的时间长度)和max-age的值。
三、lighttpd
lighttpd默认是没有开启expire模块的,需要我们在使用是手工开启这个模块支持。把mod_expire前面的“#”号去掉。
# vi  /usr/local/lighttpd/etc/lighttpd.conf
"mod_expire",
设定过期时间
* 设定指定url的过期时间:
expire.url = (
"/images/" => "access 3 hours",
"/admin/" => "access 3 hours",
"/area/" => "access 3 hours",
"/calendar/" => "access 3 hours",
"/common/" => "access 3 hours",
"/front/" => "access 3 hours",
"/inc/" => "access 3 hours",
"/jeditor/" => "access 3 hours",
"/js/" => "access 3 hours",
"/script/" => "access 3 hours",
"/theme/" => "access 3 hours",
"/upload/" => "access 3 hours",
"/view/" => "access 3 hours",
"/help/" => "access 3 hours",
"/htm/" => "access 5 minutes"
)
设置Etag
在配置文件中增加,etag.use-inode="disable"(i节点不参与etag的运算),保证多台服务器生成的Etag值一致。

   
site
site