Получить виртуальный путь для полного пути в 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")
Для приведенного выше набора сценариев это приведет к чему-то вроде:
- "/ LM / W3SVC / 33230916 / Root / someA pp"
- "/ LM / W3SVC / 33230916 / Root / someA pp / someSubA pp"
- "/ 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>