Wishlist 0 ¥0.00

微信网页授权errcode:48001

errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 86klWa06252167 ]

原因:

①:你的服务号必须是通过腾讯认证,每年是300元,如果没有认证而导致的错误提示,那就去认证,别往下看了!如果你已认证,本条原因排除,那么请继续往下看

 

②:你是否是第三方网页,第三方网页的话,那么你的url地址里面的scope这个参数要填写"snsapi_userinfo",否则会报这个错!原因如下!

我是用snsapi_base访问的,所以没有出现了这个错误,改用snsapi_userinfo的方式就好了.

原因是snssapi_base静默授权,只能获取openid,获取不了用户其他信息.

snsapi_userinfo需要用户手动同意,才可以获取用户的昵称,头像,地区信息,但是微信号是获取不到的(保护用户隐私,不能随便让人获取哈)。

使用hMailServer搭建免费邮件服务器

本文没有什么高深的技术内容,只是使用hMailServer,介绍搭建邮件服务器的全过程,供参考。

一、安装邮件服务器组件(hmailserver下载地址https://www.hmailserver.com/download)

打开软件,点下一步

 

 

 

 

选择存储数据的数据库,这里有两种选择,一种是使用嵌入型数据库Microsoft Sql Compact,另一种是自定义数据库。前一种选择,相对来说更轻量,简单,这里我选择自定义方式。

 

设置hMailServer connect密码。这个密码是链接hMaillServer 用的,稍后会使用该密码登录管理工具,配置服务器。

如果忘记,可以在安装路径的Bin文件里,找到配置文件手动更改。

因为我们选择了自定义数据库选项,在安装过程中,会提示输入管理密码,配置数据库。

选择下一步:

上图中的两个选项,如果你没有安装过hMailServer,或者安装过想使用新的数据库,选择第一个选项;如果使用已有的hMailServer数据库,选择第二个选项。这里我选择新建数据库。

数据库类型有三个选项,我选择第一个mssqlserver。

配置好数据库连接信息。可以选择数据库账户认证或者windows验证。下一步,选择sqlserver的服务程序,此步骤可选。

继续,初始化数据库完成。可以查看运行结果。

 安装完成。

 

二、hMailServer 汉化过程(喜欢使用中文的同学可以参考)

//实现:邮件服务器hMailServer管理工具hMailServer Administrator的汉化

//环境:
Windows Server 2008 R2
hMaelServer Administrator

//创建汉化文件
//在“hMailServer\Languages”下,创建后缀为“.ini”的文件“chinese.ini”,复制以下内容到文件
[Strings] String_1=文件
String_2=退出
String_3=帮助(&A)
String_5=关于...
String_6=域名
String_8=服务
String_9=帐号
String_10=别名
String_11=邮件列表
String_12=MX查询
String_13=设置
String_14=DNS缓存
String_15=SMTP
String_16=安全
String_17=POP3
String_18=IP范围
String_19=镜像
String_20=日志
String_21=欢迎
String_22=域
String_23=域名
String_25=SMTP验证
String_26=保存(&S)
String_27=帐号地址
String_28=激活
String_29=AD用户
String_30=是
String_32=密码
String_33=最大容量(MB)
String_34=大小(MB)
String_35=调试
String_40=项目
String_41=数值
String_42=动作
String_43=在下面的空格中填入活动目录相关信息,你就可以把当前用户帐号连接到活动目录中的某个帐号,当用户连接到服务器,hMailServer将使用活动目录来校验用户的密码。
String_44=活动目录帐号
String_45=用户名
String_46=重定向自
String_47=发送到
String_48=地址
String_50=常规
String_51=成员
String_52=收件人地址
String_55=服务
String_56=当前状态
String_57=E-mail地址
String_58=解析(&R)
String_59=邮件服务器
String_61=缓存更新间隔:
String_62=每个
String_63=小时
String_64=TCP端口
String_65=SMTP端口
String_66=连接
String_67=最大连接并发数(0表示无限制)
String_68=中继邮箱
String_69=重试次数
String_70=重试间隔(单位:分钟)
String_71=开放转发
String_72=垃圾邮件
String_73=允许纯文本密码验证
String_74=允许发件人为空
String_75=转发
String_80=垃圾邮件延迟,超过定量,连接将被延迟
String_81=数量
String_82=延迟(秒)
String_87=POP3端口
String_88=开始IP
String_89=结束IP
String_90=优先级
String_91=地址
String_92=0是最低优先级。100是最高优先级。
String_93=选项
String_94=允许SMTP连接
String_95=允许SMTP转发
String_96=允许POP3连接
String_97=镜像邮件地址
String_98=复制本服务器上的全部邮件,本服务器所有收到的和外发的邮件都将被转发到下面空格中所填的镜像邮件地址.
String_99=装置
String_100=记录
String_101=应用程序
String_104=TCP/IP
String_105=文件
String_106=活动目录
String_107=帐号
String_114=邮件列表
String_115=输入收件人地址
String_117=启动
String_118=停止
String_120=暂停
String_121=暂停中
String_122=运行中
String_123=启动中
String_124=停止
String_125=停止中
String_132=完成
String_133=错误
String_137=数据库服务器地址
String_138=用户信息
String_139=数据库
String_140=名称
String_149=<上一步(&B)
String_150=下一步(&N)>
String_151=取消(&C)
String_152=输入连接信息
String_153=通知
String_154=密码将以为明文方式存储在hmailserver.ini.请配置你的操作系统环境,避免其他用户读取这个文件。
String_155=向导程序有足够的信息来结束这个操作
String_158=请键入数据库服务器的名字。
String_159=请键入数据库名字
String_160=连接到
String_161=连接成功。
String_162=无法连接到数据库服务器。
String_163=创建数据库
String_164=创建数据库成功。
String_165=不能创建数据库。
String_166=预备创建数据库表格...
String_167=预创成功。
String_168=预创失败。
String_170=创建数据库表格...
String_171=创建数据库表格成功。
String_172=不能创建数据库表格。
String_173=运行hDBUpdater.exe失败
String_174=创建数据库失败.
String_175=请返回上一步,重新检测你的设置。
String_176=添加域名...
String_180=添加活动目录帐号
String_188=Root密码
String_189=Root密码(重复)
String_190=向导程序将自动为你配置hMailServer数据库。你唯一要做的就是输入要使用的Root密码。
String_192=按结束按钮退出向导。
String_193=结束(&F)
String_194=IMAP设置
String_195=IMAP端口
String_196=IMAP
String_197=SMTP转发器
String_198=欢迎信息
String_199=你输入的不是一个有效的域名。
String_200=激活
String_205=其他
String_206=调试信息
String_208=如果空格:
String_209=存在数值:
String_210=然后
String_211=删除邮件
String_212=来自
String_212=来自
String_213=查看日志
String_214=投递线程
String_215=高级
String_216=假期邮件
String_217=允许
String_218=主题
String_219=文本
String_220=你的修改没有保存,是否现在保存?
String_221=IMAP会话
String_222=允许IMAP连接
String_223=到
String_224=病毒控制
String_225=使用ClamWin
String_226=ClamScan执行命令
String_227=ClamScan病毒库路径
String_228=删除邮件
String_229=删除邮件附件
String_230=通知发件人
String_231=通知收件人
String_232=结束操作
String_233=不能创建数据库。
String_234=不能连接到
String_235=你必须输入一个Root密码。
String_236=输入的密码不匹配。
String_237=连接错误
String_238=自动侦测
String_239=hMailAdmin可以自动侦测ClamScan的安装路径和病毒库位置。请校验自动侦测的结果是否正确。
String_240=实时
String_242=清除
String_243=类型
String_244=线程
String_245=时间
String_246=IP
String_247=允许连接
String_248=请求递交验证
String_249=允许递交来自
String_250=到本地帐号
String_251=到远程帐户
String_252=本地到本地的帐号
String_253=本地到外部的帐号
String_254=外部到本地的帐号
String_255=外部到外部的帐号
String_257=IP范围
String_258=路由
String_259=路由
String_260=目标SMTP主机
String_261=重试次数
String_262=递交所有地址
String_263=只递交下列地址:
String_264=添加地址前必须先保存路由设置。
String_267=统计
String_268=发送统计结果给hMailServer.com
String_269=如果你允许此统计选项,每到1000条信息,统计结果将会被发送到hMailServer.com。请注意,只有你的版本号会被包含在统计结果中发送出去,你的个人信息和主机配置信息都不会被发送。
String_270=主机名
String_271=自动回复
String_272=刷新
String_273=未递交的邮件
String_274=ID
String_275=创建
String_276=下次尝试
String_277=关闭(&C)
String_278=捕获所有地址,所有未指定收件人的邮件都发送到:
String_279=输入密码
String_280=取消
String_281=确定
String_282=本地域名
String_283=外部域名
String_284=把这个路由视作
String_285=服务器请求验证
String_286=密码
String_288=<<加密的>>
String_289=递交
String_290=使用数据库递交记录
String_291=当病毒被发现时
String_292=使用外部反病毒扫描程序
String_293=反病毒扫描程序位置
String_294=返回值
String_295=外部反病毒扫描程序
String_298=你在SMTP设置中还没有为此主机指定公开可用的主机域名.
String_299=版本
String_300=服务器信息
String_301=开始之旅
String_302=RBL
String_303=使用SPF
String_304=校验发送者是否有DNS-MX记录
String_305=RBL
String_306=DNS主机
String_307=预期结果
String_308=拒绝信息
String_311=外部帐号
String_312=服务器地址
String_313=服务器信息
String_314=服务器类型
String_315=两次下载邮件的间隔时间(分钟)
String_316=天
String_317=立即删除邮件
String_318=在指定天数以后删除邮件
String_319=不要删除邮件
String_320=外部帐号
String_321=脚本
String_322=重新载入脚本
String_323=查看脚本
String_324=检查脚本语法
String_325=语法正确。
String_326=服务器
String_327=状态
String_328=数量
String_329=已处理邮件
String_330=带毒邮件
String_331=垃圾邮件
String_332=服务器在线从
String_333=管理级别
String_334=用户
String_335=主机别名
String_336=规则
String_337=规则
String_338=使用AND
String_339=使用OR
String_340=触发
String_341=编辑
String_342=查找类型
String_343=删除邮件
String_344=转发邮件
String_345=移动到IMAP文件夹
String_346=回复
String_347=邮件体
String_348=来自(名称)
String_349=来自(地址)
String_350=IMAP文件夹
String_351=查找
String_352=预设邮件头
String_353=自定义邮件头
String_355=邮件尺寸
String_356=抄送
String_357=匹配
String_358=包含
String_359=大于
String_360=少于
String_361=表达式
String_362=不包含
String_363=不匹配
String_364=SMTP命名中的收件人
String_365=重启hMailServer服务
String_366=最大邮件尺寸(KB)
String_367=TCP/IP监听选项
String_369=监听中
String_372=IP地址
String_373=你的hMailServer数据库已经升级。
String_374=缓存
String_375=生存时间(秒)
String_376=点击率
String_377=协议
String_378=规则循环限制
String_379=备份
String_380=还原
String_381=备份到
String_382=邮件
String_383=查看日志...
String_384=压缩文件
String_388=还原自
String_389=清除队列
String_390=你真要清除递交队列中的项目吗?
String_391=连接
String_393=启动时自动连接
String_394=服务器版本必须匹配客户端版本.服务器:%1,客户端:%2.
String_395=实用工具
String_396=从服务器发送
String_397=发送到
String_398=所有帐号
String_399=指定域名
String_400=使用通配符匹配帐号
String_401=发送
String_402=邮件已被发送。
String_403=邮件
String_404=别名
String_405=登出
String_406=解锁
String_407=立即发送
String_408=转发
String_409=允许转发
String_410=保留原始邮件
String_411=免过滤地址符
String_412=字符
String_413=扩展
String_414=校验HELO/HELO命令中的主机名
String_415=当垃圾邮件被发现时...
String_416=递交,但修改邮件头
String_417=添加X-hMailServer-Spam
String_418=添加X-hMailServer-Reason
String_419=添加到邮件主题中
String_420=灰名单
String_421=延迟重试投递的时间(分钟)
String_422=几天后移除未使用记录
String_423=几天后移除已使用记录
String_424=SURBL
String_425=SURBL
String_426=反病毒程序扫描的最大邮件尺寸(KB)
String_427=阻挡附件
String_428=阻挡如下扩展名的附件:
String_429=阻挡附件
String_430=通配符
String_431=描述
String_432=在MIME邮件头中递交给收件人
String_433=脚本功能
String_434=线程
String_435=最大线程命令
String_436=进程优先级
String_437=同名的邮件路由已经存在
String_438=SMTP转发器指定的时本机地址。你确定你要做这个操作吗?
String_439=RFC兼容性
String_440=允许无效的断行符
String_441=收到太多无效命令时,断开客户端连接
String_442=无效命令允许数
String_443=绑定到本地IP地址
String_444=单次会话中允许的最大收件人数
String_445=你必须指定IP范围段的开始/结束地址。
String_446=同名的IP范围段已经存在
String_447=性能
String_448=默认域名
String_449=服务器信息
String_450=运行功能脚本
String_451=隐藏密码
String_452=类型
String_453=公开-任何人都可以发送到本列表
String_454=成员-只有列表成员才能发送到本列表
String_455=通告-只有下列地址才被允许发送到本列表:
String_456=已使用容量(MB)
String_457=这个域名设置了最大尺寸,因此你必须指定帐号最大尺寸
String_459=无效的用户名或密码。
String_460=连接时,询问密码
String_461=保存密码
String_462=会话
String_463=尽快地
String_464=立即递交...
String_465=使用SQL服务器验证
String_466=使用Windows验证
String_467=数据库名
String_468=验证
String_469=白名单
String_470=TCP/IP端口
String_471=协议
String_472=签名
String_473=纯文本签名
String_474=HTML签名
String_475=使用此签名,如果发件人帐号中没有指定签名
String_476=覆盖帐号签名
String_477=追加帐号签名
String_478=允许签名
String_479=添加签名到回复邮件
String_480=添加签名在本地邮件
String_481=允许域名签名
String_482=hMailServer管理员密码
String_483=最后登陆时间
String_484=最大帐号数量
String_485=最大别名数量
String_486=最大邮件列表数量
String_487=无法添加新的帐号,因为已经到达本域名的最大帐号数限制。
String_488=无法添加新的别名,因为已经到达本域名的最大别名数限制。
String_489=无法添加新的邮件列表,因为已经到达本域名的最大列表数限制。
String_490=限制
String_491=帐号最大容量(MB)
String_496=转发中继
String_497=你确定要删除%s?
String_498=注意:此功能是设计用来备份数据库小于1GB的电子邮件数据。如果您的数据库大于这个范围,请参考文件使用外部工具备份。
String_499=从接收头检索日期
String_500=向上移动
String_501=向下移动
String_502=自动过期
String_503=立即下载
String_504=如果此选项被取消选中许多电子邮件服务器将不会接受从您的服务器上发出的电子邮件。您确定要取消选择它?
String_505=您已设定hMailServer不允许空发件人的电子邮件地址。许多电子邮件服务器将不接受电子邮件从您的服务器与此配置。
String_506=停止规则处理
String_507=激活SMTP
String_508=激活POP3
String_509=激活IMAP
String_510=hMailServer管理员密码
String_511=您需要这个密码可以管理您的hMailServer安装,请记住它。
String_513=组
String_514=组
String_515=权限为%s
String_516=任何人
String_517=SSL证书
String_518=SSL证书
String_519=此操作将改变配置TCP/IP端口为默认值。您确定要这么做?
String_520=无
String_521=设置标头值
String_522=号的尝试
String_523=头名称
String_524=选择...
String_525=空帐户
String_526=文件夹
String_527=访问
String_528=编辑权限...
String_529=使用SSL
String_530=证书文件
String_531=私钥文件
String_532=添加传递至头
String_533=公共文件夹的名称
String_534=权限
String_535=选择全部
String_536=选择无
String_537=查找
String_538=读
String_539=创建邮箱
String_540=删除邮箱
String_541=管理
String_542=插入邮件
String_543=一笔勾销
String_544=保持看到国旗
String_545=保留删除标志
String_546=保持其他标志
String_547=无
String_548=垃圾邮件评分
String_550=垃圾邮件测试
String_551=反垃圾邮件
String_552=垃圾邮件评分马克门槛
String_553=垃圾邮件评分降低门槛
String_554=密码安全性太低,你确定要使用它?
String_555=当前会议
String_556=个人信息
String_557=名字
String_558=姓氏
String_559=使用SpamAssassin的
String_560=使用评分从SpamAssassin的
String_561=本地主机名
String_562=远程主机名
String_563=远程TCP/IP端口
String_564=配置警告
String_565=打开的会话数
String_566=文件名
String_567=传递队列
String_568=启用
String_569=转发给
String_570=下一个下载
String_571=其他行动
String_572=编辑文件夹
String_574=添加(&A)...
String_575=编辑(&E)...
String_576=公用文件夹
String_577=垃圾邮件标志的门槛
String_578=垃圾邮件删除门槛
String_579=分数
String_580=SSL证书
String_581=证书文件
String_582=私钥文件
String_583=索引...
String_584=选择语言...
String_585=连接...
String_586=文件(&F)
String_587=帮助(&H)
String_588=管理密码
String_589=TCP/IP端口
String_590=严重性
String_591=高
String_592=关键
String_593=hMailServer配置为允许从外部交货的IP范围%s的外部帐户这可能使服务器容易受到垃圾邮件。我们建议您禁用此选项。
String_594=确定(&O)
String_595=属性
String_596=动作
String_597=选择(&S)...
String_598=选择
String_599=发送使用路由
String_600=数字的尝试
String_601=仅包括本次会议
String_602=创建文件夹
String_603=删除文件夹
String_604=显示
String_606=添加...
String_607=空文件夹
String_608=比较
String_609=删除
String_610=选择语言
String_611=语言
String_612=你确定要删除帐户中的所有邮件?
String_614=TCP/IP地址
String_615=对象
String_616=保存
String_617=天
String_618=添加
String_619=此操作将更改IP配置范围为默认值。您确定要这么做?
String_620=最大邮件大小扫描(或)
String_621=保持文件打开
String_622=测试
String_623=匹配
String_624=不匹配
String_626=如果你要自动备份进程,请使用脚本StartBackup.vbs在\hMailServer\扩展\工具发现。
String_627=hMailServer必须重新启动使更改生效。
String_628=你想重新启动hMailServer吗?
String_629=该hMailServer服务器已重新启动。
String_630=如果您更改这些设置,hMailServer必须重新启动使更改生效。
String_631=最大数目的异步任务线程
String_632=诊断
String_633=此工具允许您执行您的hMailServer安装诊断。
String_634=选择您想要的域上运行测试。
String_635=复制到剪贴板
String_637=自动停用
String_638=过期
String_639=传入中继
String_640=最大无效的登录尝试
String_641=分钟前复位
String_642=分钟自动班
String_643=创建和发送副本
String_644=允许路线者
String_645=交付尝试
String_646=消息索引
String_647=请注意...
String_648=更多细节...
String_649=该自动禁止功能块的IP地址。如果有太多无效的登录尝试是从一个特定的IP地址时,该IP地址将被禁止。
String_650=如果您正在运行一个Web邮件系统,这意味着邮件系统可能会被封锁,如果太多无效的登录尝试向它提出的。
String_651=你确定要删除所选的项目?
String_652=绕道灰名单对SPF通行证
String_653=本地到本地电子邮件地址
String_654=当地和外部电子邮件地址
String_655=外部当地的电子邮件地址
String_656=外部外部电子邮件地址
String_659=目前已有此名称的文件夹。
String_660=层次定界符
String_661=一个文件夹名称不能包含的层次分隔符。
String_662=绕道灰名单留言时从A或MX记录到达。
String_663=当发件人选择路由时,发件人为
String_664=当收件人选择路由时,收件人为
String_665=远程电子邮件地址
String_666=本地的电子邮件地址
String_667=该hMailServerIMAP的层次分隔符%S1。文件夹名称指定包含了%S2标准不是一个层次分隔,但可能是一个文件夹名称的一部分。如果您选择保存当前文件夹的名称,一个单一的文件夹名为%S3将被创建时,这一行动是执行。是否要使用此文件夹的名称?
String_668=测试...
String_669=不正确的用户名或密码。

//注:这里选【文件】--【另存为】--【编码】处要选“Unicode”(如图),否则乱码,--【保存】--“确认另存为,已存在。chinese.ini要替换它吗?”选【是】


(hmailserver-2011092215)


//修改“hMailServer\Bin”下,“hMailServer.INI”的配置
ValidLanguages=english,swedish,chinese

//重启hMailServer服务
//按“win+r”组合键,调出运行窗口输入“services.msc”,在“服务”窗口中找到“hMailServer”服务,并重启该服务

//hMailServer管理器设置
//【开始】--【所有程序】--【hMailServer】--【hMailServer Administrator】--【connect】--输入“hMailServer”的密码--【File】--【Select language...】--选择“chinese”--【OK】
//重新连接,输入密码进入,如图
 

(hmailserver-2011092216)

 
//至此,邮件服务器hMailServer管理工具hMailServer Administrator汉化完成……
 

三、服务端配置

启动管理工具,输入管理密码,连接到服务端。

 现在要做的第一件事就是添加域,单击“域名-添加”。

 

 

展开“设置”,配置smtp和Pop3。

 

 

接下来,配置RFC兼容性。

 

 配置完成后,千万不要忘记 保存。

下面展开“高级”,配置ip地址范围。先配置MyComputer。 

 

 再配置Internet

 

 然后打开下面的TCP/IP 端口,配置SMTP和POP3 

 

 

为了让外网能访问,这里要填上服务器的IP,填好以后要求重启hMailServer,重启即可。

 

以上配置好以后,我们来创建用户

点开刚才新建的域名,添加一个test账户,填写密码。注意,光标焦点离开这个密码输入框后,就不显示了,不要输错

 

 记着点保存

 四、账号测试,我用的是Foxmail(注:本人使用网易大师配置测试发现收邮件没问题,但是发邮件会出现验证错误,提示ErrorStartTLSAvailable,暂未找到解决办法!!)

 新建一个账号(其中POP接收服务器SMTP发送服务器地址可以用ip也可以用配置的mx记录对应的域名:如mail.**.com)

 

 

 

写一封邮件,发送试试

 

收件人已收到邮件

 

 以上配置结束。

 

另外,在配置过程可能会出现客户端连不上邮件服务器的问题,遇见这个问题

可以用Telnet命令查看一下邮件服务器和本机是否已经开启25端口、110端口,尤其是服务器,若没有开启,要记着打开。

配置完成后,只能在内网中收发邮件,如果要实现外网收发,要配置mx交互记录:登录你的域名管理后台,添加mx记录,将邮件地址路由到邮件服务器。

 

五、域名mx配置过程:

首先对**.com添加一条A记录(如图type为A),依次输入二级域名的的名字比如mail(相当于mail.**.com)、type为A、邮件服务器的ip地址;

接下来添加mx记录

如果你是以**.com作为邮件后缀地址(对应上面域名设置地址)的话第一个输入框不用填或者用@就行,如果你是以二级域名做后缀、比如@mail.**.com就输入mail,第二个输入框Prior是优先级,也就是用这条mx指向的优先级,type不用说了是MX,接着这个输入框输入你刚才增加的A记录的二级域名( mail.**.com )

这样邮件域名就基本创建成功了(一般4-24小时生效),接下来在hmailserver域名设置那里与你上面增加的mx记录第一个输入框的内容相对应(若为空就是**.com)、保存,域名设置基本上就成功了。)

六、网页管理平台搭建PHPWebAdmin(由于通过客户端和程序收发邮件已经满足使用,该功能尚未实现。。。)

网上可以搜索iis+php+mysql配置(有相关说明)

如何通过远程桌面连接 重启电脑

方法一:ALT+F4

方法二:计算机指令操作

“windows键” + R,输入  : shutdown -r -t 0 ,确定即可。(计算机立即重启)

 

-r 重新启动计算机
-s 关闭计算机
-t xx 在xx秒后操作(一般为关闭或重启) 当然,-t 0即为立即重启计算机
若xx不为0,则会有个界面出现
-a 放弃操作(即-t中的xx不为0的时候,或者出现关闭的界面时使用)

Expires Headers for SEO: Why You Should Think Twice Before Using Them

After Google’s announcement of the impact of site speed on search rankings, many articles were written about the benefits of setting expires headers to control browser caching. However, after researching cache control extensively I found no articles that explain how to determine which resources of a site should be cached- so instead of explaining how to implement them (there are tons of resources out there, like Apache.org) this article explains what expires headers are and how they benefit SEO, explains the dangers of improper implementation, and offers some insight on preventing issues.

What Are Expires Headers and How Do They Benefit SEO?

Example of Expires Headers

Expires headers tell the browser whether a resource on a website needs to be requested from the source or if it can be fetched from the browser’s cache. When you set an expires header for a resource, such as all jpeg images, the browser will store those resources in its cache. The next time the visitor comes back to the page it will load faster, as the browser will already have those images available.

Improving a site’s loading speed ultimately improves its functionality and has many benefits including lower bounce rates, higher average time spent on site, etc. (because no one likes slow websites!). If your site is faster than your competitors’ sites, you may also see better rankings in Google’s search results. Another benefit is that better site speed can also improve the cost of hosting a site that sucks up a lot of bandwidth on your server.

There are many tools out there to help measure a site’s speed, such as Yslow, Google Pagespeed, Pingdom Tools, etc. and they all recommend implementing expires headers- but none of them explain what to consider before doing so. For example, the Yahoo Developer Network states that there are only two aspects to cache control: “For static resources: implement “Never expire” policy by setting far future Expires header,” and “For dynamic resources: use an appropriate Cache-Control header to help the browser with conditional requests.” What exactly is an “appropriate” header, though?

The Dangers

The ultimate purpose of setting expires headers is to avoid unnecessary HTTP requests, but how do you know when a request is and isn’t necessary or appropriate? Here are some things to think about before implementing expires headers:

Which resources on the site do you expect to update frequently? The obvious disadvantage to implementing expires headers is the fact that if a resource is set to expire too far into the future and you want to make updates to the site (whether planned or not), your visitors will not see the changes until the header expires in their browser. It is important to think about how far into the future you expect the resources to remain the same to determine the most appropriate expiration date. This seems obvious but it is important to evaluate even the smallest resources of a site before setting any expires headers. That being said, I highly recommend not using the ExpiresDefault header that sets a default time span for all resources. In most cases, you will not want to set a general expiry date for everything.

Is the site an ecommerce site? If so, you need to consider the effects of setting expires headers that may cause issues with the shopping cart. Ecommerce sites can run into major issues if expires headers are not set appropriately. For example, if a returning visitor tries to add products to their shopping cart but the resources are cached (such as html, css, any product image files, etc.), the cart will show products that were added in the past and not the recently added products. Of course, simply refreshing your cache with CTRL+F5 will fix the problem, but how many visitors are going to know that? They are going to become frustrated and end up leaving without buying anything.

  • Can I cache only specific images/scripts/html/etc? Sometimes it is not appropriate to cache an entire group of scripts, images, or other static resources across the entire site, but it would be helpful to cache certain ones. For example, if I have an ecommerce site that is updated somewhat frequently, I may want to set expires headers for specific images rather than all the images on the entire site. Setting expires headers for certain resources, like header images that do not change, will allow the site to load faster, while the product images can be updated without the browser caching them. This will ensure that you are able to update product images and your customers will see the new pictures and, most importantly, the product images will not get cached or “stuck” in a user’s shopping cart.
  • How can I cache only specific resources? Using the example above, if you would want to add expires headers to only specific resources on your site you can do so in a couple different ways.
    • One way is to create two separate asset folders: one for static resources and the other for resources that are frequently updated. Place all of the resources (such as images, scripts, etc.) that you would like to set far-future expirations for into the static folder and then add an .htaccess file to that folder that includes the expires headers. Place the rest of the resources that you do not want cached into the other folder . The folder with frequently updated resources should also contain an htaccess file, but should have a no-cache header explicitly stated in it (so the opposite of the other folder). This ensures the content won’t be cached.
    • If your site is built on a framework like CodeIgniter, simply add static sub-folders within your images, css, and scripts folders and you can add individual .htaccess files to each with the appropriate expires headers.
    • For .NET sites, you can separate specific resources of a page you would like to cache by “fragment caching.” Basically, you would create your own controls that would contain expires headers for the specific resources you want cached. Take a look at Caching Portions of an ASP.NET Page for more information on how to do this.
    • Another way that is recommended by Google Developers is to use “fingerprinting” to cache resources that change occasionally. There is an example of how this is done on the Google Developers Best Practices page, but to sum it up- according to Google Developers:

      “You accomplish this by embedding a fingerprint of the resource in its URL (i.e. the file path). When the resource changes, so does its fingerprint, and in turn, so does its URL. As soon as the URL changes, the browser is forced to re-fetch the resource. Fingerprinting allows you to set expiry dates long into the future even for resources that change more frequently than that. Of course, this technique requires that all of the pages that reference the resource know about the fingerprinted URL, which may or may not be feasible, depending on how your pages are coded.”

Every site is going to have different requirements and different needs for functionality. Not all resources on a site absolutely need to be cached either. For instance, html generally loads pretty quickly so there is usually no real need to cache it regardless of how terribly slow your site may be. If your site is slow (especially your homepage), I would recommend taking the questions above into consideration and focusing on the major resources like images and scripts that tend to be the main cause of slow sites . If you can master expires caching and understand when it is and isn’t appropriate you can greatly improve the functionality, usability and search engine-friendliness of your site.

So, what do you think- did I forget anything? Do you know of any other potential risks of setting expires headers? What do you consider are best practices for adding expires headers?

About Us

Since 1996, our company has been focusing on domain name registration, web hosting, server hosting, website construction, e-commerce and other Internet services, and constantly practicing the concept of "providing enterprise-level solutions and providing personalized service support". As a Dell Authorized Solution Provider, we also provide hardware product solutions associated with the company's services.
 

Contact Us

Address: No. 2, Jingwu Road, Zhengzhou City, Henan Province

Phone: 0086-371-63520088 

QQ:76257322

Website: 800188.com

E-mail: This email address is being protected from spambots. You need JavaScript enabled to view it.