Как я могу получить 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;
}

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

Jaggu
источник

Ответы:

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('/') ;
Rufo
источник
Внутри контроллера используйте 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"]
Talha
источник
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;
SpazDude
источник
1

Я использую следующий код из Application_Start

String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);

Криспийн Ланге
источник
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

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

FAHID
источник
0

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

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);
Пранав Джозеф
источник
Пожалуйста, объясните ваш код, чтобы другие пользователи могли понять его функциональность. Спасибо!
Игнасио Ара
-1
 string baseURL = HttpContext.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