Получить виртуальный путь для полного пути в Asp Classic - PullRequest
8 голосов
/ 20 мая 2009

Как мне получить виртуальный путь для полного пути в 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 ]

14 голосов
/ 04 июня 2010

В случае, если кому-то будет интересно, ответ Энтони Джонса показал мне путь к последовательному получению относительного корня приложения. Так что если у вас есть сайт на 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 / on localhost / example

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

ToRootedVirtual("")
4 голосов
/ 21 мая 2009

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

Успение

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

Сценарий 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 / 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
0 голосов
/ 26 марта 2013

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

<%Response.Write "http://" & Request.ServerVariables("server_name") &  
left(Request.ServerVariables("SCRIPT_NAME"),InStrRev(Request.ServerVariables("SCRIPT_NAME"),"/"))   %>
</p>
0 голосов
/ 22 июня 2012

Вот как вы решаете путь корневых связей в 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" />

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

0 голосов
/ 20 мая 2009

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

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

то есть

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

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

0 голосов
/ 20 мая 2009

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

...