Jak mogę uzyskać baseurl strony?

183

Chcę napisać małą metodę pomocniczą, która zwraca podstawowy adres URL witryny. Oto co wymyśliłem:

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;
}

Czy jest w tym jakiś błąd, o którym możesz pomyśleć? Czy ktoś może to poprawić?

Jaggu
źródło

Odpowiedzi:

324

Spróbuj tego:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";
Frank Allenby
źródło
13
To jedyna znaleziona przeze mnie odpowiedź, która dotyczy przypadku, w którym strona jest aplikacją będącą dzieckiem witryny najwyższego poziomu w IIS.
John
6
string.Format ("{0} {1} /", Request.Url.GetLeftPart (UriPartial.Authority), Request.ApplicationPath.TrimEnd ('/'))
diegohb
2
Request.Url.Scheme nie zawsze działa, jeśli masz wewnętrzną konfigurację HTTP i wewnętrzną konfigurację protokołu HTTP dla https na serwerze, ale używasz https * na zewnątrz. Aby obejść ten problem, po prostu stworzyłem specyficzny dla środowiska klucz AppSetting „UrlScheme” o wartości „http” lub „https” w zależności od tego, gdzie znajduje się strona internetowa. Dostęp do tego ustawienia w pliku web.config można uzyskać za pomocą ConfigurationManager.AppSettings [„Key”]
Ben Sewards
3
Nie uwzględnia to równoważenia obciążenia, w którym występuje odszyfrowywanie, ani przekazywania proxy. Przy użyciu tego adresu możesz uzyskać niepoprawny adres, więc bądź ostrożny i dowiedz się, gdzie została wdrożona Twoja witryna.
Conor Gallagher,
$ "{System.Web.HttpContext.‌ Current.Request.Url.GetLeftPart (UriPartial.Authority)} {System.Web.HttpContext.Cur‌ rent.Request.ApplicationPath? .TrimEnd ('/')} /";
Ryan Penfold,
166
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

Otóż ​​to ;)

Czarodziej
źródło
25
To nie działa w przypadku ścieżki wirtualnej ani aplikacji. Oprócz lewej części należy użyć Request.ApplicationPath.
Warlock,
podstawowy adres URL to httpx: //domain.com: [port] / musisz samodzielnie dodać ścieżkę aplikacji do tego rozwiązania
Paweł Cioch
9

Niestety, popularne GetLeftPartrozwiązanie nie jest obsługiwane w wersji PCL Uri. GetComponentsjest jednak, więc jeśli potrzebujesz przenośności, powinno to załatwić sprawę:

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);
Todd Menier
źródło
6

Uważam, że powyższe odpowiedzi nie biorą pod uwagę, gdy witryna nie znajduje się w katalogu głównym witryny.

To jest dla kontrolera WebApi:

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;
rufo
źródło
Z poziomu kontrolera użyj Configuration.VirtualPathRoot, ponieważ jest on niezależny od hosta.
Darrel Miller
5

Dla mnie @ warlock wygląda jak do tej pory najlepsza odpowiedź, ale zawsze używałem tego w przeszłości;

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

Lub w kontrolerze WebAPI;

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

co jest przydatne, więc możesz wybrać format ucieczki, który chcesz. Nie jestem pewien, dlaczego istnieją dwie tak różne implementacje i, o ile mogę powiedzieć, ta metoda i @ warlock zwracają dokładnie ten sam wynik w tym przypadku, ale wygląda na to, GetLeftPart()że działałoby również mailtona przykład dla tagów podobnych do Uri innych niż serwer .

cirrus
źródło
zwraca nieprawidłowy adres URL w przypadkach, gdy jesteś za tunelem ngrok i https
Mohammad Zekrallah
5

Jest to metoda o wiele bardziej głupia.

VirtualPathUtility.ToAbsolute("~/");
Daniel A. White
źródło
Połączenie @Daniel nie wróci po prostu, /jeśli hostujesz w jakiejś domenie aplikacji, np. Twój serwer / nazwa_aplikacji / twoja ścieżka_prota
vibs2006
@ vibs2006 tak, to jest trochę ambitne pytanie
Daniel A. White
4

idę z

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
Talha
źródło
1
Spowoduje to dodanie protokołu: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "Http: //": "https: //") + HttpContext.Request.ServerVariables ["HTTP_HOST"]
onemorecupofcoffee
4

Na podstawie tego, co napisał Warlock, stwierdziłem, że wirtualny katalog główny ścieżki jest potrzebny, jeśli nie jesteś hostowany w katalogu głównym swojej sieci. (Działa to dla kontrolerów MVC Web API)

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;
SpazDude
źródło
1

Używam następującego kodu z Application_Start

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

Crispijn Lange
źródło
1

To działa dla mnie.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : zwraca pełną ścieżkę taką samą, jak w przeglądarce.
  • Request.Url.PathAndQuery : zwraca (pełną ścieżkę) - (nazwa domeny + PORT).
  • Request.ApplicationPath : return „/” na serwerze hostowanym i „nazwa aplikacji” przy lokalnym wdrożeniu IIS.

Więc jeśli chcesz uzyskać dostęp do swojej nazwy domeny, rozważ podanie nazwy aplikacji w przypadku:

  1. Wdrożenie IIS
  2. Jeśli aplikacja została wdrożona w subdomenie.

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

Dla dev.x.us/web

zwraca ten silny tekst

FAHID
źródło
0

Proszę użyć poniższego kodu                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);
Pranav Joseph
źródło
Wyjaśnij swój kod, aby inni użytkownicy mogli zrozumieć jego funkcjonalność. Dzięki!
Ignacio Ara
-1
 string baseURL = HttpContext.Request.Url.Host;
shebin c babu
źródło
-2

mógłbyś dodać port dla portu innego niż 80 / SSL?

coś jak:

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());
            }

i wykorzystać to w końcowym wyniku?

Mark Redman
źródło
6
Request.Url.Authoritybędzie zawierać numer portu, jeśli jest niestandardowy
Andomar