我真是服了,昨天为了赶工,想着把那个外包做的华丽丽的‘关于我们’页面(一个纯HTML)直接塞进我的ASP网站里,就在后台导航加了个链接指过去,结果你猜怎么着?点进去整个网站的头部导航和CSS样式全没了!就剩一个光秃秃的页面杵在那里,像被扒光了衣服,我当时血压就上来了,凌晨三点啊兄弟,客服消息叮叮当当响个不停。
抽了两根烟冷静下来才想明白,ASP(Active Server Pages)它是个动态服务器脚本,你直接链接到一个.html文件,服务器就当静态文件扔给浏览器了,根本不会去执行你全局的包含文件或者数据库连接那些玩意儿,这就是典型的把动态站当静态站搞,不出问题才怪。
所以,正确的‘调用’(或者说包含、渲染)方法,核心思想是让ASP引擎去读取HTML文件的内容,然后把它当做动态响应的一部分吐出来。这里有几个我试过(并且踩过坑)的保命方法:
1. Server.Execute 或 Server.Transfer:这是最正统的之一。比如你在 `index.asp` 里,想插入 `footer.html`,可以这么写:。这招会让服务器临时跳转到那个HTML文件,执行完(虽然HTML没ASP代码可执行)再把控制权返回来,效果就是你首页的ASP变量、函数环境它都能继承。但路径不对会报错报得你怀疑人生,切记用绝对虚拟路径(以/开头)。
2. FileSystemObject (FSO) 读取文件:这个更直接,像用程序打开文件一样把HTML内容读出来,然后直接用Response.Write糊到页面上。代码如下(这是一个例子,生产环境记得加错误处理):
Dim fso, ts, contentrnSet fso = Server.CreateObject("Scripting.FileSystemObject")rnSet ts = fso.OpenTextFile(Server.MapPath("/path/to/your/file.html"), 1)rncontent = ts.ReadAllrnts.ClosernSet ts = NothingrnSet fso = NothingrnResponse.Write content
这方法粗暴有效,但一定要注意服务器权限! IIS默认账号可能没权读取某些目录,到时候给你报个‘权限被拒绝’,又是半个钟头的调试。别问我怎么知道的。
3. ADODB.Stream 对象:FSO的替代方案,传说中更稳定,尤其对付不同编码的HTML文件时不容易乱码。代码长这样:
Dim stream, contentrnSet stream = Server.CreateObject("ADODB.Stream")rnstream.Type = 2 ' 指定为文本类型rnstream.Charset = "utf-8" ' 根据你文件编码来定,这是大坑!rnstream.Openrnstream.LoadFromFile Server.MapPath("/path/to/file.html")rncontent = stream.ReadTextrnstream.ClosernSet stream = NothingrnResponse.Write content
最后,血的教训:如果你整个页面都是静态的,只是想在ASP站点里管理,强烈建议你直接把它重命名为.asp后缀,哪怕里面一行ASP代码都没有!这样服务器就会按动态流程处理它,你就能正常使用 `"> 之类的包含语句了,省心一百倍。别像我一样,为了个后缀名,差点把站给折腾崩了。记住,在ASP的世界里,后缀名就是‘立场’问题!
