【问题标题】:IIS Handler Mappings for classic asp page include(.inc) file经典 asp 页面包含 (.inc) 文件的 IIS 处理程序映射
【发布时间】:2019-03-08 18:46:08
【问题描述】:

我正在将经典 ASP 站点迁移到托管在 IIS 10 中的较新版本的 Windows 服务器。

在加载default.asp页面时,我在浏览器的开发者工具中发现,网络选项卡说找不到helpers.inc文件。但它与默认页面在同一个文件夹中。

helpers.inc 文件在 default.asp 页面中被这段代码调用:

<script src="helpers.inc" language="VBScript" defer="true"></script>

如果我尝试从浏览器访问 helpers.inc 文件,我会收到此错误:

HTTP Error 404.3 - Not Found
The page you are requesting cannot be served because of the extension configuration. If the page is a script, add a handler. If the file should be downloaded, add a MIME map.

Most likely causes:
•It is possible that a handler mapping is missing. By default, the static file handler processes all content.
•The feature you are trying to use may not be installed.
•The appropriate MIME map is not enabled for the Web site or application. (Warning: Do not create a MIME map for content that users should not download, such as .ASPX pages or .config files.)
•If ASP.NET is not installed.

我尝试使用 %windir%\system32\inetsrv\asp.dll 可执行文件为 *.inc 文件添加处理程序映射,但它似乎不起作用。给我一个新错误:

HTTP Error 404.17 - Not Found
The requested content appears to be script and will not be served by the static file handler.

Most likely causes:
•The request matched a wildcard mime map. The request is mapped to the static file handler. If there were different pre-conditions, the request will map to a different handler.

我想知道我需要什么才能让 asp 页面识别/读取 include(.inc) 文件?

【问题讨论】:

  • 我的理解(我可能错了)是 .inc 文件被视为只是常规文本文件,并且更多地用于模板集成而不是包含 asp 代码的页面,尽管 VBscript 包含在如果包含在 asp 页面中,.inc 文件仍将执行。默认情况下,它们当然不会被 IIS 视为与 .asp 文件相同的文件。我一直避免使用它们,因为我从来没有真正看到过这一点(事实上,它们看起来很危险)。首先检查 .inc 文件中包含的内容,但您可能只需要添加 MIME 类型即可。
  • @Adam,它只是 VBScript 函数。我试过如果我将 helpers.inc 中的代码复制到脚本标签中,页面就会正确加载。抱歉不熟悉处理程序映射,您提到添加 MIME 类型,是在 IIS 中,单击网站/应用程序->MIME 类型->在那里添加新的 MIME 类型?如果是,我应该在这里使用什么 MIME 类型?文本/纯文本?非常感谢。
  • 我可能会等待其他人发表评论,因为我不能 100% 确定 inc 文件。但是是的 text/plain 将是我使用的 MIME 类型。但是,只是重申一下;如果您的 inc 文件位于公共目录中,则它们的源代码将被公开。
  • 如果只是VB函数,为什么不使用?我管理一个古老的经典 ASP 应用程序,这就是为此加载 VB 函数的方式。
  • 阅读@Lankymart 发布的重复问题似乎设置mime 映射对于inc 文件来说是个坏主意,因为它们显然不打算由IIS 直接提供服务。这很有意义。您收到的错误消息是正确的,IIS 应该阻止您通过 HTTP 加载 inc 文件。问题是你没有正确地包括它们(正如已经回答的那样)。使用 inc 文件作为 SSI 不需要 mime 映射。

标签: asp-classic include


【解决方案1】:

如果这行是它在迁移代码中的显示方式(不做任何修改)

<script src="helpers.inc" language="VBScript" defer="true"></script>

那么一件事就清楚了。

这不是 SSI (服务器端包含)

该标签将带有.inc 扩展名的文件定义为客户端 VBScript。但目前,您还没有告诉 IIS .inc 是一种文件类型,它可以用作 text/vbscript

注意:在页面中定义客户端 VBScript 将严重限制跨浏览器的兼容性,因为 VBScript 仅在 older versions of Internet Explorer 中受支持。


为什么是404.3

404.3 的原因是因为IIS blocks unknown file types。要解决此问题,您需要在 IIS 中添加一个 MIME 类型映射,我通常不建议使用 .inc is sometimes used as an extension for SSI files,但我们已经揭穿了映射 MIME 类型的理论。


为什么它不是 SSI

在经典 ASP 页面中运行服务器端脚本只有三种方式;

  1. 使用处理器标签

    <%
        ...
    %>
    
  2. 使用带有runat="server" 属性的脚本标签。

    <script language="VBScript" runat="server">
        ...
    </script>
    
  3. 使用 #include 指令添加 SSI。

    <!-- #include virtual = "somefile.asp" -->
    

有用的链接

【讨论】:

  • 那你建议他做什么来解决他的问题?
  • @Julie 这取决于.inc 文件是什么。如果它包含服务器端脚本(处理器标签或服务器端脚本标签),则不应直接访问它,因此404.17 是正确的行为,OP 需要使用@987654341 @ 语法允许它在 ASP 页内运行。如果没有,则 OP 需要为 .inc 添加 MIME 类型映射,否则它将继续返回 404.3,这是未映射文件类型的默认行为。但是就像我已经说过的那样,如果 OP 提供的脚本标签是来自迁移的 Web 应用程序的“原样”,那么它就不可能是 SSI。
  • @Lankymart,对不起,直到我回答完上面每个人的 cmets 才注意到答案。很好的答案。我尝试了您列出的第 3 种方法,现在 asp 页面显示了我创建的 Helpers.asp 页面中的所有函数源代码,其中所有内容都是从 Helpers.inc 复制的。不确定是否需要删除之前添加的 MIME 映射?
  • @Lankymart,我做了一些尝试和错误,意识到它是针对客户端的,代码实际上是由页面上的其他 VBscript 代码调用的。我想这是一个糟糕的实现。基本上代码是将数据从数据库加载到页面下拉列表中。
  • (虽然我可能会继续用javascript重写它。)
【解决方案2】:

收录作品,但 Lankymart 的回答是正确的。

我创建了一个 helpers.inc 文件:

Sub MakeAMsg(MsgText)
    MsgBox MsgText
End Sub

我使用了 Include 并保留了 .inc 扩展名:

<script language=VBS>
<!--#include file=helpers.inc-->
makeamsg("This Used Include")
</script>

它有效。我用 VBS 扩展名重命名了 .inc:

<SCRIPT language=VBS src=helpers.vbs></SCRIPT>
<script language=VBS>
makeamsg("This Used Script tags with vbs extension")
</script>

这也有效。

我检查了我的服务器,默认情况下 .vbs 设置为 text/vbscript 的 mimetype。 (我正在设置另一个我没有改变任何东西的地方,它也有这个映射。)

所以使用#include 确实 工作,但是将扩展名更改为 .vbs 或添加一个复制 .vbs mime 类型的 mimetype 会更好。

【讨论】:

  • language=vbs 是客户端 VBScript 可接受的标识符吗?
  • .vb 文件,你在谈论使用 VB.Net 的 ASP.Net 吗? SSI 是一项 IIS 功能,它允许将服务器端脚本包含在经典 ASP 页面中。通常它们只使用.asp 扩展名(因为这是默认的处理程序映射扩展名),但有时它们被重命名为.ssi.inc 以表示它们打算成为#include 文件。但是我不认为这是一个 SSI,因为脚本标签不能像那样用来调用服务器端脚本。
  • @Lankymart 是的,它是客户端和服务器端 VBScript 的有效别名。 JScript 更糟糕。 ECMAScriptJavaScriptJavaScript1.1JavaScript1.2JavaScript1.3LiveScript 都指向JScript:/
  • @Lankymart 在我们编写的应用程序中工作,我从未更改过它。
  • 可能值得一提的是,如果您将文件用作服务器端包含,则文件扩展名是什么无关紧要,IIS 将解析它,就好像它是其中的页面的一部分它包括在内。 .inc 扩展名只是将其识别为包含文件的约定。
猜你喜欢
  • 2010-12-07
  • 2012-07-21
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
相关资源
最近更新 更多