获取asp经典中完整路径的虚拟路径

时间:2009-05-20 14:11:13

标签: asp-classic server.mappath virtual-path

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

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

方法不起作用。

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

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

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

6 个答案:

答案 0 :(得分:14)

如果有人感兴趣,安东尼琼斯的回答告诉我如何一致地获得应用程序的相对根。因此,如果您的网站位于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("/")

将返回:

  • / on example.com
  • / example / on localhost / example

您也可以使用它而不使用斜杠:

ToRootedVirtual("")

答案 1 :(得分:4)

如果我理解了这个问题。

<强>假设

完整路径是当前应用程序或子应用程序中的路径。它不是限制父级的路径,也不是进入兄弟应用程序的路径。所需路径相对于当前应用程序路径。

情景1

诸如

之类的路径

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

应将其解析为: -

“〜/ someFolder / someSubFolder / file.ext”

(尽管〜/ notation不是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 /根/ someApp”
  2. “/ LM / W3SVC / 33230916 /根/ someApp / someSubApp”
  3. “/ LM / W3SVC / 33230916 /根”
  4. 另外

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

    将在所有场景中返回

    “/ LM / SVC / 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
    

答案 2 :(得分:0)

虽然可能有更好的方法,但我总是通过创建一个配置变量来实现这一点,我手动指定不属于虚拟路径的根路径。这是因为您不知道该站点是以root用户身份,在根Web中的文件夹下还是在虚拟目录中部署。

答案 3 :(得分:0)

好吧,我的回答并不比OrbMan的好......

我组织了我的应用程序,每个包含都是相对的......

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

在其他情况下,我只是做奥尔布曼所说的......

答案 4 :(得分:0)

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

这个小小节将产生正确的前缀来设置您的网址:

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" />

所以,将您的路径编码为root-relative(以/开头),然后将此代码段放在引号内的第一个斜杠前面:

答案 5 :(得分:0)

服务器的虚拟路径为:

<%Response.Write "http://" & Request.ServerVariables("server_name") &  
left(Request.ServerVariables("SCRIPT_NAME"),InStrRev(Request.ServerVariables("SCRIPT_NAME"),"/"))   %>
</p>