使用 ssi 服务器端包含文件

来源:互联网 发布:bs公式推导过程 知乎 编辑:程序博客网 时间:2024/04/29 17:48

这两天在使用 .net 环境写一个网站,网站内有部分内容没有使用用户控件,而是使用 SSI 进行服务器端包含的

主要针对的是页面广告部分,希望达成的效果是将广告放到一个文件内,不再读取数据库

于是先尝试使用用户控件方式,这个时候发现基本上无法判断广告的位置信息,如果把广告位置信息传递进用户控件,需要改动的地方实在太多,放弃

再次尝试 SSI 方式,每一个广告单独生成一个 shtml 文件,然后 include file 包含后成功

这很好,继续尝试

因为需要广告可以出现一个位置多个广告轮换显示,所以决定使用 SSI 包含一个动态文件

首先,我使用 ASP 的时候,ASP 文件内使用 SSI 包含是没有问题的,但是使用 .net 时,每一个.net文件头都有一个 Page 声明,使用 .aspx 直接包含 .aspx 是冲突的,并且,使用 SSI 包含服务器端文件是不能传递参数的

所以更换一下思路,在这里,我建立了一个公共广告文件adinfo.aspx,然后将广告的 <!--#include file="ad001.shtml"--> 修改成 <!--#exec cgi="ad/ad_001.aspx"-->,然后在生成广告的时候,吧 adinfo.aspx 的 Page 声明生成到 ad_001.aspx 中,也就是说 ad_001.aspx 内容只有一行“<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="adinfo.aspx.cs" Inherits="******" %>

然后在 adinfo.aspx.cs 中接受一下服务器参数 Request.ServerVariables["SCRIPT_NAME"],就可以得到广告位置信息了,然后就可以根据广告位置输出响应的广告内容

------------------------------------

在尝试的过程中,发现SSI 包含是优先于脚本执行的,在 include file 后,包含的文件加载完成后才会对当前页面进行编译或解释,然后发现 .shtml 文件包含其他文件时,是没有任何执行过程,例如 a.shtml 中有一段 <!--#include file="b.asp"-->,而b.asp的代码是 <%response.write "<hr/>"%>,打开 a.shtml 后内容就是把b.asp代码完全输出了,没有运行,所以只能使用 exec 方法来加载服务器端文件

0 0