Получить виртуальный путь для полного пути в Asp Classic

Как я могу получить виртуальный путь для полного пути в ASP Classic. Обратите внимание, что полный путь может быть в виртуальном каталоге и, следовательно, упрощенный

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

метод не сработает.

Изменить: чтобы уточнить, пример следует

  • Полный путь к файлу Windows (известен):\\MyServer \MyShare \ Web \ Site \ Logs \ Test.txt
  • У моего веб-сайта есть виртуальный каталог, который называется " Журналы" и указывает на \\MyServer \MyShare \ Web \ Site \ Logs \.
  • Виртуальный путь (неизвестно): /Logs/Text.txt
  • Http-путь (неизвестно, необходимо): http://site/Logs/Test.txt
  • Код находится на странице asp в главном приложении, а не в каких-либо виртуальных каталогах. Он расположен на отдельном сервере от рассматриваемого файла.
  • IIS 6.0

    Как найти виртуальный путь из полного пути к файлу?

6 ответов

В случае, если кому-то будет интересно, ответ Энтони Джонса показал мне путь к последовательному получению относительного корня приложения. Так что если у вас есть сайт по адресу http://example.com/ и локальный эквивалент разработки по адресу http://localhost/example, вы можете найти свой root с помощью этой функции:

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
  • / пример / на локальном хосте / пример

Вы также можете использовать его без косой черты:

ToRootedVirtual("")

Если я понял вопрос

предположение

Полный путь - это путь в текущем приложении или дочернем приложении. Это не путь, ограниченный родителем, ни путь в одноуровневое приложение. Требуемый путь относительно текущего пути приложения.

Сценарий 1

Путь, такой как

"/SomeA pp/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 / someA pp"
  2. "/ LM / W3SVC / 33230916 / Root / someA pp / someSubA pp"
  3. "/ LM / W3SVC / 33230916 / Root"

Также

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

Хотя может быть лучший способ, я всегда делал это, создавая переменную конфигурации, где я вручную определяю корневой путь, который не является частью виртуального пути. Это связано с тем, что вы не знаете, будет ли сайт развернут как root, в папке в корневой сети или в виртуальном каталоге.

Ну, мой ответ не лучше, чем у OrbMan...

Я организовал свое приложение таким образом, чтобы каждое включение было относительным...

то есть

вместо \myapp\lib\somefile.asp я использую..\lib\somefile.asp

в других случаях я просто делаю то, что сказал Орбман...

Вот как вы решаете путь корневых ссылок в html через ASP, чтобы ваш сайт можно было переносить в разные каталоги хостинга.

Этот небольшой фрагмент даст правильный префикс для установки ваших 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" />

Итак, закодируйте ваши пути, чтобы они были относительными к корню (начинается с /), а затем поместите этот фрагмент прямо перед первым слешем, внутри кавычек:

Виртуальный путь к серверу:

<%Response.Write "http://" & Request.ServerVariables("server_name") &  
left(Request.ServerVariables("SCRIPT_NAME"),InStrRev(Request.ServerVariables("SCRIPT_NAME"),"/"))   %>
</p>
Другие вопросы по тегам