Как эффективно управлять корневыми относительными URL в веб-разработке - PullRequest
1 голос
/ 19 сентября 2011

Я разрабатываю веб-приложение, в котором мои ресурсы будут размещены в каталоге http://www.site.com/resources/

. В моих HTML-кодах я буду ссылаться на этот каталог по абсолютному пути / resources /, нопроблема заключается в том, что когда я проверяю это на веб-сервере, путь теперь будет http://localhost/webapp/resources/, а при использовании абсолютного пути будет искать // localhost / resources /

Я обнаружил, что могу использовать./ для ссылки на относительный корневой каталог веб-приложения, и это работает.Но мне не нравится, как это выглядит.

Какие у меня есть альтернативы?

  • Использовать абсолютный путь и поместить приложение в каталог ROOT сервера
  • Использоватьпеременная PHP / JSP, определяющая текущий корневой каталог
  • Продолжайте использовать ./
  • Другое ...

Заранее спасибо!

1 Ответ

3 голосов
/ 21 июня 2012

Чтобы перефразировать вашу проблему, у вас есть сайт, который должен работать в двух разных конфигурациях:

  • http://servername/mypage.htm и
  • http://servername/SubSite/mypage.htm

Вторая конфигурация может представлять собой тестовый сайт (возможно, даже localhost на компьютере разработчика).

Все пути к изображениям, ссылкам, таблицам стилей должны работать с относительной адресацией в любом развертывании.

Таким образом, установка src = "/ resources / mypic.jpg" для изображения не сможет выполнить тест на примере SubSite (называемый виртуальным каталогом или приложением в IIS), потому что / скажет ему посмотреть http://servername/resources вместо http://servername/SubSite/resources и поэтому он не работает.


Моя позиция для моей команды разработчиков - ВСЕГДА использовать относительный путь к документу.

Таким образом, в базовом примере mypage.htm, которыйнаходится в корне дерева веб-сайта (независимо от того, где он находится в файловой системе или на веб-сервере), вы должны установить src = "./ resources / mypic.jpg" для изображения * По сути, помните, что вHTML, когда вы видите "./" этозначит с этой с.Если вам нужно перейти в каталог (скажем, у вас есть другая страница в ~ / Reports / myreport.htm, на которой также нужно показать это изображение, вы должны установить источник тега изображения на этой странице как src = "../ resources/mypic.jpg ", что означает перейти на один уровень выше.

Обратите внимание, что я сделал что-то подлое. В ASP.NET ~ / означает корень веб-сайта, независимо от того, где он находится. Яиспользуя его в качестве краткого обозначения для обозначения корня сайта. Хотя в ASP.NET любой серверный элемент управления может фактически использовать URL с ~ / перед ним, и он будет правильно преобразовывать его в правильный путь.

Я остановлюсь на еще одном важном моменте, который я только что изучил сегодня, при исследовании других частей этой проблемы: в файле CSS, если вы используете относительные к документу пути для указания на изображения и т. Д., Этот путь относится к файлу CSS.Это хорошо, потому что CSS-файлы редко меняют положение относительно файлов изображений. Однако то, что называется CSS-файлом, действительно перемещается, что подводит меня к следующему пункту.


WhЯ уже объяснил, что отлично работает с основными веб-страницами и делает их очень переносимыми.Если у вас есть несколько страниц в разных каталогах со ссылками на код или элементы управления, которые генерируют HTML-ссылки на CSS, изображения и т. Д., Вам также необходимо исправить эти пути.

По сути, вам нужно изменить эти URL-адреса (обычнов коде или элементах управления, которые вы написали), чтобы иметь ./ или ../, необходимые для доступа к ресурсу, который вы имели в виду.

В ASP вы можете использовать VBscript для использования Server.MapPath ("/ resources /mypic.jpg "), чтобы получить нужный URL-адрес относительно корня сайта.

В ASP.NET вы можете использовать Page.MapPath (" ~ / resources / mypic.jpg "), чтобы получить правильныйURL, который вам нужен.

Я также написал функции для генерации только правильного ./ или ../ разреза, который мне нужен в .NET, следующим образом:

public static string GetDotDotSlashesToRoot(string Path, bool IncludeTrailingSlash) {
        System.Text.StringBuilder result = new System.Text.StringBuilder();
        Path = Path.Replace("\\", "/");
        Path = Path.Replace("~", string.Empty);
        if (Path.Length > 0 && Path[0] == '/') Path = Path.Substring(1);
        string slashless = Path.Replace("/", "");
        for (int i = 0; i < Path.Length - slashless.Length; i++) {
            result.Append("../");
        }

        if (!IncludeTrailingSlash && result.Length > 0) result = result.Remove(result.Length - 1, 1);

        return result.ToString();
    }

Вы можете запустить это через converter.telerik.com для преобразования в VB.net, если это необходимо.Я настроил свои мастер-страницы для показа глобальной переменной javascript JSPATHTOSITEROOT, используя эту функцию, чтобы я мог также префиксировать любые пути, которые мне нужны через JS.

Для PHP я не затрагивал это некоторое время, поэтому всеможет дать несколько указателей на другой код, который я опубликовал, чтобы решить эту проблему аналогично: http://us2.php.net/manual/en/function.dirname.php#91208

Эта ссылка показывает, как заставить PHP включать в себя работу, как в C / C ++, включая вложение, но вы можете использовать тот же приемчтобы исправить ваши пути и для html.

В заключение я хочу сказать, что если кто-нибудь передаст вам проект с путями для изображений и css, которые начинаются с "/", они не пройдут тест.Код не является переносимым.Хороший веб-разработчик в 21-м веке знает, что сайт может быть развернут в корне сервера или в качестве подсайта по разным причинам и соответствующим образом.

...