Asp classic 获取asp classic中完整路径的虚拟路径

Asp classic 获取asp classic中完整路径的虚拟路径,asp-classic,server.mappath,virtual-path,Asp Classic,Server.mappath,Virtual Path,如何在ASP classic中获取完整路径的虚拟路径。请注意,完整路径可能位于虚拟目录下,因此 virtPath = Replace(fullPath, Server.MapPath("/"), "") 这种方法行不通 编辑:为了澄清,下面是一个示例 完整的Windows文件路径(已知): \\MyServer\MyShare\Web\Site\Logs\Test.txt 我的网站有一个虚拟目录 调用了指向\\MyServer\MyShare\Web\Site\Logs\的日志 虚拟路径(

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

virtPath = Replace(fullPath, Server.MapPath("/"), "") 
这种方法行不通

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

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

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


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

嗯,我的答案并不比奥伯曼的好

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

就是

我使用..\lib\somefile.asp代替\myapp\lib\somefile.asp


在其他情况下,如果我理解了这个问题,我就照奥尔曼说的去做。

假设

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

情景1

路径,如

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

应决心:-

“~/someFolder/someSubFolder/file.ext”

(尽管~/符号不是ASP classic所能理解的)

场景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")
对于上述场景集,这将导致如下结果:-

  • “/LM/W3SVC/33230916/Root/someApp”
  • “/LM/W3SVC/33230916/Root/someApp/someSubApp”
  • “/LM/W3SVC/33230916/Root”
  • 在所有情况下都会返回吗

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

    如果有人感兴趣,Anthony Jones的回答告诉了我如何一致地获取应用程序的相对根。因此,如果您有一个位于的站点和一个与之相当的本地开发站点,您可以通过以下功能找到您的根目录:

    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上
    • /示例/on localhost/example
    您也可以在不使用斜杠的情况下使用它:

    ToRootedVirtual("")
    

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

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

    Mid(Request.ServerVariables("APPL_MD_PATH"),Len(Request.ServerVariables("INSTANCE_META_PATH"))+6)
    
    您可以在链接、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" />
    
    
    
    因此,将路径编码为根相对路径(以/开头),然后将此代码段放在第一个斜杠前面的引号内:

    服务器的虚拟路径是:

    
    


    不太正确,很遗憾,请参见编辑以获得澄清。您能否再澄清一件事,这段代码在哪里运行?在应用程序的ASP页面中?还有什么IIS版本?IIS6?我真的不喜欢经典的asp,因为大多数现代网络语言都解决了这些小问题,但人们仍然想要经典的asp网站。。。哦,人性。但这很有魅力,谢谢。当然,这种方法在global.asa中不起作用,因为您无法访问请求对象。这是解决我的类似问题的一个很好的方法!
    <link href="<%= Mid(Request.ServerVariables("APPL_MD_PATH"),Len(Request.ServerVariables("INSTANCE_META_PATH"))+6) %>/assets/css/master.css" rel="stylesheet" type="text/css" />
    
    <%Response.Write "http://" & Request.ServerVariables("server_name") &  
    left(Request.ServerVariables("SCRIPT_NAME"),InStrRev(Request.ServerVariables("SCRIPT_NAME"),"/"))   %>
    </p>