8

如何在 ASP 经典中获取完整路径的虚拟路径。请注意,完整路径可能位于虚拟目录下,因此过于简单

virtPath = Replace(fullPath, Server.MapPath("/"), "") 

方法行不通。

编辑:为了澄清,下面是一个例子

  • 完整的 Windows 文件路径(已知): \\MyServer\MyShare\Web\Site\Logs\Test.txt
  • 我的网站有一个名为Logs的虚拟目录,它指向\\MyServer\MyShare\Web\Site\Logs\
  • 虚拟路径(未知):/ Logs/ Text.txt
  • http路径(未知,需要): http://Site/Logs/Test.txt
  • 该代码位于主应用程序的 asp 页面中,而不是任何虚拟目录下。它位于与相关文件不同的服务器上。
  • IIS 6.0

    如何从完整文件路径中找到虚拟路径?

4

6 回答 6

14

如果有人感兴趣,Anthony Jones 的回答向我展示了始终如一地获取应用程序相对根的方法。因此,如果您有一个位于http://example.com的站点和一个位于http://localhost/example的本地开发等价物,您可以使用以下函数找到您的根目录:

Function ToRootedVirtual(relativePath)
    Dim applicationMetaPath : applicationMetaPath = Request.ServerVariables("APPL_MD_PATH")
    Dim instanceMetaPath : instanceMetaPath = Request.ServerVariables("INSTANCE_META_PATH")
    Dim rootPath : rootPath = Mid(applicationMetaPath, Len(instanceMetaPath) + Len("/ROOT/"))
    ToRootedVirtual = rootPath + relativePath
End Function

然后你可以这样调用它来获取根路径:

ToRootedVirtual("/")

哪个会返回:

  • /在example.com上
  • /example/ 在 localhost/example 上

您也可以不使用斜线使用它:

ToRootedVirtual("")
于 2010-06-03T20:13:55.177 回答
4

如果我理解了这个问题。

假设

完整路径是当前应用程序或子应用程序中的路径。它不是仅限于父应用程序的路径,也不是通向同级应用程序的路径。所需路径是相对于当前应用程序路径的。

方案 1

路径如

“/someApp/someFolder/someSubFolder/file.ext”

应该解决它: -

“~/someFolder/someSubFolder/file.ext”

(虽然 ~/ 符号不是 ASP 经典的理解)。

方案 2

“/someApp/someSubApp/SomeSubFolder/file.ext”

你还想要:-

“~/someFolder/someSubFolder/file.ext”

方案 3

该应用程序是该站点的根应用程序:-

“/someFolder/someSubFolder/file.ext”

仍然会变成

“~/someFolder/someSubFolder.file.ext”

解决方案

解决这个问题的关键是:-

Dim sAppMetaPath : sAppMetaPath = Request.ServerVariables("APPL_MD_PATH")

对于上述场景,这将导致如下结果:-

  1. “/LM/W3SVC/33230916/Root/someApp”
  2. “/LM/W3SVC/33230916/Root/someApp/someSubApp”
  3. “/LM/W3SVC/33230916/根”

Dim sInstanceMetaPath: sInstanceMetaPath = Request.ServerVariables("INSTANCE_META_PATH")

在所有情况下都会返回

“/LM/W3SVC/33230916”

通过一些数学简化,我们可以得出函数:-

Function ToAppRelative(virtualPath)

    Dim sAppMetaPath : sAppMetaPath = Request.ServerVariables("APPL_MD_PATH")
    Dim sInstanceMetaPath: sInstanceMetaPath = Request.ServerVariables("INSTANCE_META_PATH")

    ToAppRelative = "~/" & Mid(virtualPath, Len(sAppMetaPath) - Len(sInstanceMetaPath) - 3)

End Function
于 2009-05-20T20:10:13.497 回答
0

Although there may be a better way, I always did this by creating a config variable where I manually specify the root path that is not part of the virtual path. This is because you do not know if the site will be deployed as root, under a folder in root web, or in a virtual directory.

于 2009-05-20T14:20:11.253 回答
0

好吧,我的答案并不比 OrbMan 的好……

我以这样一种方式组织我的应用程序,即每个包含都是相对的......

那是

而不是 \myapp\lib\somefile.asp 我使用 ..\lib\somefile.asp

在其他情况下,我只是按照 Orbman 所说的去做......

于 2009-05-20T17:40:15.280 回答
0

以下是您如何通过 ASP 解决 html 中的根相关路径,以便您的站点可以移植到不同的托管目录。

这个小片段将生成正确的前缀来设置您的 URL:

Mid(Request.ServerVariables("APPL_MD_PATH"),Len(Request.ServerVariables("INSTANCE_META_PATH"))+6)

您可以在 LINK、IMG、超链接等中使用它,如下所示:

<link href="<%= Mid(Request.ServerVariables("APPL_MD_PATH"),Len(Request.ServerVariables("INSTANCE_META_PATH"))+6) %>/assets/css/master.css" rel="stylesheet" type="text/css" />

因此,将您的路径编码为相对于根的路径(以 / 开头),然后将此代码段放在第一个斜杠前面的引号内:

于 2012-06-21T21:20:40.293 回答
0

服务器的虚拟路径是:

<%Response.Write "http://" & Request.ServerVariables("server_name") &  
left(Request.ServerVariables("SCRIPT_NAME"),InStrRev(Request.ServerVariables("SCRIPT_NAME"),"/"))   %>
</p>
于 2013-03-26T11:34:10.213 回答