HTML относительные ссылки на различные домены - PullRequest
1 голос
/ 19 мая 2010

У меня есть свысока:

Когда вы кодируете / разрабатываете темы, как вы ссылаетесь на различные файлы в своем HTML / CSS-коде?

Пример: В нашей фирме мы в основном используем <base target="http://whatever"> в нашем основном шаблоне, а затем просто <img src="./images/file.png"> в нашем html, "/category/page" в качестве ссылок и что-то похожее в нашем CSS.

Однако при тестировании на разных машинах мы используем ip-адрес, а не localhost на главной станции разработчика кодера, поэтому все базовые ссылки не работают (потому что localhost идет на просмотр машины, а не кодера в нашей сети).

То же самое происходит при обновлении страниц - на сервере разработчиков мы должны отредактировать базовую цель, чтобы при просмотре сайта мы не перешли на живой сайт - эта часть на самом деле довольно простая PHP (if ... echo else echo something else), но все же не решить проблему больше проблем тестирования кода.

Итак, мой вопрос, как ВЫ это решаете? Как вы используете относительные ссылки, которые в основном не заботятся о том, на каком домене находится страница, и не заботятся о перезаписи URL? (потому что ../images/ отличается для / и отличается для /something/somethingElse/page)?

Ответы [ 4 ]

1 голос
/ 19 мая 2010

Я знаком с проблемой, которую вы описали выше. Это особая проблема, когда у вас есть несколько сред: разработка, тестирование, производство и т. Д. Я пробовал большинство из того, что все предлагали выше, но обнаружил, что они эффективны лишь частично. Чтобы окончательно решить эту проблему, я создал собственный элемент управления, который я назвал «AnchorDomain». Этот элемент управления позволяет просто указать путь, такой как "/ category / page" или "/images/file.png", в его свойства VirtulPath, и он будет динамически создавать правильный URL-адрес для вас в зависимости от среды, в которой вы работаете ваш проект. Таким образом, для всех проблемных URL в моем проекте я просто использую этот элемент управления и могу запускать свой код независимо от среды, и все мои URL-адреса разрешаются с правильным именем. Так, например, вот пример синтаксиса на странице aspx.

<cc1:AnchorDomain runat="server" Title="My Homepage" Url="default.aspx" UsePageVirtualPath="false" />

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

Сначала это может показаться излишним, но этот элемент управления решает эту проблему во всех случаях, с которыми я столкнулся.

См. Код ниже:

Наслаждайтесь!

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.ComponentModel;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Pdc.EventPro.WebControls
{
  [DefaultProperty("Text"), ToolboxData("<{0}:AnchorDomain1 runat=server></{0}:AnchorDomain1>")]
  public class AnchorDomain : Control
  {
    private string _href = string.Empty;

    public AnchorDomain()
    {
      VirtualPath = HttpContext.Current.Request.Path.Substring(0, HttpContext.Current.Request.Path.LastIndexOf("/") + 1);
    }

    private string VirtualPath
    {
      get
      {
        return (string)ViewState["virtualPath"];
      }
      set
      {
        ViewState["virtualPath"] = value;
      }
    }

    [Bindable(true), Category("Content"), DefaultValue("Performance Development Corporation")]
    public string Title
    {
      get
      {
        return (string)ViewState["title"];
      }

      set
      {
        ViewState["title"] = value;
      }
    }

    [Bindable(true), Category("Content"), DefaultValue("")]
    public string LinkText
    {
      get
      {
        return (string)ViewState["linktext"];
      }

      set
      {
        ViewState["linktext"] = value;
      }
    }

    [Bindable(true), Category("Content"), DefaultValue("")]
    public string Url
    {
      get
      {
        return (string)ViewState["url"];
      }

      set
      {
        ViewState["url"] = value;
      }
    }

    [Bindable(true), Category("Content"), DefaultValue("false")]
    public bool UsePageVirtualPath
    {
      get
      {
        return (bool)ViewState["useVirtualPath"];
      }

      set
      {
        ViewState["useVirtualPath"] = value;
      }
    }

    [Bindable(true), Category("Content"), DefaultValue("false")]
    public string CssClass
    {
      get
      {
        return (string)ViewState["CssClass"];
      }

      set
      {
        ViewState["CssClass"] = value;
      }
    }

    protected override void Render(HtmlTextWriter writer)
    {
      if (string.IsNullOrEmpty(Url) && UsePageVirtualPath == false)
      {
        _href = CreateUri(HttpContext.Current.Request.Url.GetLeftPart(System.UriPartial.Authority), HttpContext.Current.Request.ApplicationPath).ToString();
      }
      else if (!string.IsNullOrEmpty(Url) && UsePageVirtualPath == true)
      {
        _href = CreateUri(HttpContext.Current.Request.Url.GetLeftPart(System.UriPartial.Authority), CombineUri(VirtualPath, Url)).ToString();
      }
      else
      {
        _href = CreateUri(HttpContext.Current.Request.Url.GetLeftPart(System.UriPartial.Authority), CombineUri(HttpContext.Current.Request.ApplicationPath, Url)).ToString();
      }

      writer.WriteBeginTag("a");
      writer.WriteAttribute("href", _href);
      writer.WriteAttribute("title", Title);
      writer.WriteAttribute("class", CssClass);
      writer.Write(HtmlTextWriter.TagRightChar);
      writer.Write(LinkText);
      writer.WriteEndTag("a");

      base.Render(writer);
    }

    private Uri CreateUri(string baseUri, string relativeUri)
    {
      Uri result = null;

      if (Uri.TryCreate(new Uri(baseUri), relativeUri, out result))
      {
        return result;
      }

      return result;
    }

    private string CombineUri(string basePath1, string basePath2)
    {
      return string.Format("{0}/{1}", basePath1.TrimEnd('/'), basePath2.TrimStart('/')); 
    }
  }
}
1 голос
/ 19 мая 2010

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

 $dirs        = substr_count($url, '/');        // Counts slashes in url

 $sRoot       = '';     // Set sRoot var
 if ( $dirs   == 0 ) {      // If they're no slashes    
   $sRoot     = './';       // Set sRoot var 
 } else {
    $x = 0;     
    while ($x < $dirs ) {       // Else, for every slash, put a ../         
      $sRoot  .= '../';
      $x++;     // Increment x var  
    }
 }

Это прекрасно работает для нас из-за того, как настроен наш файл htaccess. Это не займет много времени, чтобы заставить его работать со стандартными страницами.

0 голосов
/ 19 мая 2010

Лично мне не нравится использование базы, так как это приводит к проблемам, с которыми вы сталкиваетесь. Абсолютные пути всегда лучше, так как они однозначны. Если вы хотите сказать, переключать темы или версии библиотек javascript или любые другие ваши ссылки, которые могут динамически генерироваться вашим приложением, чтобы отразить это, например:

/libs/v1/javascript.js

/themes/blue_theme/mycss.css
0 голосов
/ 19 мая 2010

Лично я всегда использую абсолютные пути (т. Е. /path/to/file.css) и держусь подальше от base в целом.

Рассматривали ли вы редактирование файла hosts для сопоставления IP-адресов локальным именам хостов?

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1        localhost
172.16.185.128   some.dev.server # maps http://some.dev.server/ to http://172.16.185.128/
...