Как я могу получить baseurl сайта?


183

Я хочу написать небольшой вспомогательный метод, который возвращает базовый URL-адрес сайта. Вот что я придумал:

public static string GetSiteUrl()
{
    string url = string.Empty;
    HttpRequest request = HttpContext.Current.Request;

    if (request.IsSecureConnection)
        url = "https://";
    else
        url = "http://";

    url += request["HTTP_HOST"] + "/";

    return url;
}

Есть ли в этом какая-то ошибка, о которой вы можете подумать? Кто-нибудь может улучшить это?



Ответы:


324

Попробуй это:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";

13
Это единственный найденный мной ответ, который касается случая, когда сайт представляет собой приложение, являющееся дочерним сайтом сайта верхнего уровня в IIS.
Джон

6
string.Format ("{0} {1} /", Request.Url.GetLeftPart (UriPartial.Authority), Request.ApplicationPath.TrimEnd ('/'))
diegohb

2
Request.Url.Scheme не всегда работает, если у вас настроен внутренний http и для него настроено прекращение SSL для https на сервере, но выполняется https * снаружи. Чтобы обойти это, я просто создал специфичный для окружения ключ AppSetting «UrlScheme» со значением «http» или «https» в зависимости от того, где находится сайт. К этому параметру в файле web.config можно получить доступ ConfigurationManager.AppSettings ["Key"]
Бен Сьюардс,

3
Это не учитывает балансировку нагрузки, где происходит дешифрование, или прямые прокси. При этом вы можете получить неправильный адрес, поэтому будьте осторожны и узнайте, где был развернут ваш сайт.
Конор Галлахер

$ "{System.Web.HttpContext. Current.Request.Url.GetLeftPart (UriPartial.Authority)} {System.Web.HttpContext.Cur rent.Request.ApplicationPath .TrimEnd ( '/')?} /";
Райан Пенфолд

166
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

Это оно ;)


25
Это не работает для Virtual или Application Path. Вы должны использовать Request.ApplicationPath в дополнение к левой части.
Чернокнижник

URL-адрес базы: httpx: //domain.com: [порт] / вы сами должны добавить путь к приложению к этому решению
Pawel Cioch

9

Популярное GetLeftPartрешение не поддерживается в версии PCL Uri, к сожалению. GetComponentsОднако если вам нужна переносимость, это должно помочь:

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);

6

Я считаю, что ответы выше не учитывают, когда сайт не находится в корне сайта.

Это для контроллера WebApi:

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;

Внутри контроллера используйте Configuration.VirtualPathRoot, так как он не зависит от хоста.
Даррел Миллер

5

Для меня @ warlock's выглядит как лучший ответ здесь, но я всегда использовал это в прошлом;

string baseUrl = Request.Url.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.UriEscaped)   

Или в контроллере WebAPI;

string baseUrl = Url.Request.RequestUri.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.Unescaped)

что удобно, так что вы можете выбрать, какой формат выхода вы хотите. Мне непонятно, почему существуют две такие разные реализации, и, насколько я могу судить, этот метод и @ warlock возвращают точно такой же результат в этом случае, но похоже, что GetLeftPart()он также будет работать, например, для несерверных mailtoтегов Uri. ,


возвращает неверный URL для случаев, когда вы находитесь за туннелем ngrok и https
Мохаммед Зекралла

5

Это гораздо более надежный метод.

VirtualPathUtility.ToAbsolute("~/");

Вызов @Daniel не будет возвращен просто, /если вы разместите в каком-либо домене приложения, например, yourserver / yourapplicationname / yourrootpath
vibs2006

@ vibs2006 да, это своего рода неоднозначный вопрос
Дэниел А. Уайт

4

Я иду с

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

1
Это добавит протокол: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "Http: //": "https: //") + HttpContext.Request.ServerVariables ["HTTP_HOST"]
onemorecupofcoffee

4

Основываясь на том, что написал Warlock, я обнаружил, что корневой каталог виртуального пути необходим, если вы не размещены в корневом каталоге вашей сети. (Это работает для контроллеров MVC Web API)

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;


1

Это работает для меня.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : возвращает полный путь, аналогичный показу в браузере.
  • Request.Url.PathAndQuery : вернуть (полный путь) - (имя домена + PORT).
  • Request.ApplicationPath : возвращает «/» на размещенном сервере и «имя приложения» при локальном развертывании IIS.

Поэтому, если вы хотите получить доступ к вашему доменному имени, рассмотрите возможность включения имени приложения в случае:

  1. Развертывание IIS
  2. Если ваше приложение развернуто на поддомене.

====================================

Для dev.x.us/web

вернуть этот сильный текст


0

Пожалуйста, используйте код ниже                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);

Пожалуйста, объясните ваш код, чтобы другие пользователи могли понять его функциональность. Спасибо!
Игнасио Ара


-2

Вы могли бы добавить в порт для не порт 80 / SSL?

что-то вроде:

if (HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != null && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "80" && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "443")
            {
                port = String.Concat(":", HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString());
            }

и использовать это в конечном результате?


6
Request.Url.Authorityбудет включать номер порта, если он нестандартный
Andomar
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.