日期:2010-04-17  浏览次数:20904 次

  你注意到没有,利用MX/UD开发程序时,所有需要链接数据库的页面中,都会在页面的开始部分使用包含文件调用数据库链接文件,如:
<!--#include file="Connections/con123456.asp" -->
  那么这段代码有什么好研究的吗?当然有研究了,如果你没有正确使用它,那么也许你在本地调试很正常的程序,一旦传到服务器上就出错,一个可能的原因就是包含文件在作怪!让我们了解一下什么是包含文件:

●包含文件
  全称:Server_Side Include ,从名称上一看就知道应该是服务器端的包含文件,简称 SSI.
  SSI 为用户提供在 Web 服务器处理之前将一个文件的内容插入到另一个文件的方法。ASP 只使用这一机制的#include 指令。要在 .asp 文件中插入一个文件,使用下面的语法:
<!--#include virtual | file ="filename"-->
  virtual 和 file 关键字指示用来包含该文件的路径的类型,filename 是您想包含的文件的路径和名称。
  被包含文件不要求专门的文件扩展名;但是,为被包含文件赋予 .inc 扩展名以便和其他类型文件相区分是一个良好的编程习惯。由于大部分虚拟主机服务商并没有设置 inc 的解释,如果填入 .inc 的文件地址,就会直接显示在浏览器源代码里。所以强烈建议在使用 include 的数据库联接文件还有包括有 asp 源代码的文件时,一定要把后缀改为 .asp

Virtual 关键字
  使用 Virtual 关键字指出路径开始于虚拟目录。例如,如果一个被命名为 Footer.inc 的文件属于一个名为 /Myapp 的虚拟目录,则下面的一行将把 Footer.inc 的内容插入到包含该行的文件中:
<!--#include virtual ="/myapp/footer.inc"-->

File 关键字
  使用 file 关键字指示使用相对路径。相对路径开始于含有该包含文件的目录。例如,如果您的文件位于目录 Myapp 中,而文件 Header1.inc 在 Myapp\Headers 中,下面的一行将把 Header1.inc 插入到您的文件中:
<!--#include file ="headers/header1.inc"-->
  注意,到被包含文件 Headers/header1.inc 的路径是相对于包含文件的;如果包含 #include 语句的脚本不在 /Myapp 目录中,那么该语句将不起作用。
特别注意:如果在 Internet 服务管理器中的“启用上层目录”选项被选中,则也可以使用 file 关键字和 ../ 语法包含父目录即上一层目录中的文件。
  但一般情况下,为了安全考虑,WEB空间服务商在设置服务器时,“启用上层目录”选项是被禁止使用的,而你利用MX/UD开发并在本地机器上调试程序时,所有需要链接数据库的页面中,都会在页面的开始部分使用包含文件调用数据库链接文件,例如:
<!--#include file="Connections/con123456.asp" -->
  如果没有考虑到“包含父目录”这个问题,页面中可能会出现:
<!--#include file="../Connections/con123456.asp" -->
  类似的形式,在本地数据库链接很正常(本地设置虚拟目录时,“启用上层目录”选项默认是选中状态),上传到服务器当中就会出现错误,这是初学UD/MX来开发动态网站,特别是没有ASP基础就直接利用UD/MX学习动态开发技术的朋友们容易忽视的地方。最好的方法是在本地调试程序时,将“启用上层目录”选项关闭(禁止使用),以获得和远程服务器上相同的开发环境。

设置方法如下:
  启动IIS管理器;查看你设置的虚拟目录/站点属性,在弹出的属性面板中点击主目录或虚拟目录标签,如下:

  点击应用程序设置区当中的[配置…]按钮,弹出应用程序配置设置面板,如下图:

点击“应用程序选项”标签,将其中的“启用父目录”的钩选符号去掉。点击确定按钮返回。

●被包含文件的位置
  被包含文件可以在您的 Web 站点内的某个目录中,也可以在您的 Web 站点之外。通常,您应该使被包含文件位于 Web 站点的目录中。如果一个被包含文件位于您的 Web 站点内,则当浏览器下次请求包含文件时,将显示对被包含文件的改变。但是,如果被包含文件位于您的 Web 站点之外,直到 ASP 应用程序重新启动或 Web 服务器重新启动时,这种改变才能体现出来。ASP 检测在应用程序命名空间中(在应用程序的起始目录下)的任何包含文件的改变。

●包含文件:提示和警告
  一个被包含文件也可以包含其他的文件。如果 #include 指令没有导致循环,一个 .asp 文件可以多次包括同一个文件。例如,如果文件 First.asp 包含文件 Second.inc,则 Second.inc 一定不能再包含 First.asp。一个文件也不能包含自身。ASP 检测此类循环或嵌套错误,并在检测到时产生一个错误消息,同时停止处理被请求的 .asp 文件。
  ASP 在执行脚本命令之前包含文件。因此,不能用脚本命令去创建被包含文件的名称。例如,下面的脚本将不能打开 Header1.inc,因为 ASP 会在它分配一个文件名给变量 name 之前先执行 #include 指令。
<!-- This script will fail -->
<% name=(header1 & ".inc") %>
<!--#include file="<%= name %>"-->
  脚本命令和过程必须完全包含在脚本定界符 <% 和 %> 、HTML 标记 <SCRIPT> 和 </SCRIPT> 或 HTML 标记 <OBJECT> 和 </OBJECT> 中。也就是说,不能在一个 .asp 包含文件中打开一个脚本定界符,然后在一个被包含的文件中才关闭该定界符;脚本或脚本命令必须是一个完整的单元。例如,下面的脚本将无法运行:
<!-- This script will fail -->
<%
For i = 1 To n
 statements in main file
 <!--#include file="header1.inc" -->
Next
%>
下面的脚本将正常运行:
<%
For i = 1 to n
 statements in main file
%>
<!--#include file="header1.inc" -->
<% Next %>