사이트의 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에서 최상위 웹 사이트의 자식 인 응용 프로그램이있는 사이트를 다루는 유일한 대답입니다.
John

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

2
Request.Url.Scheme은 내부 http가 구성되어 있고 서버에서 https에 대해 SSL 종료가 설정되었지만 https *가 외부에서 실행될 때는 항상 작동하지 않습니다. 이 문제를 해결하기 위해 웹 사이트가있는 위치에 따라 "http"또는 "https"값으로 환경 별 AppSetting 키 "UrlScheme"을 만들었습니다. web.config의이 설정은 ConfigurationManager.AppSettings [ "Key"]를 통해 액세스 할 수 있습니다.
Ben Sewards

3
여기에는로드 밸런싱, 암호 해독이 발생하는 위치 또는 프록시를 고려하지 않습니다. 이 주소를 사용하면 잘못된 주소가 생길 수 있으므로 웹 사이트가 어디에 배포되었는지주의해서 확인하십시오.
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)

그게 다야;)


25
가상 또는 응용 프로그램 경로에는 작동하지 않습니다. 왼쪽 이외에도 Request.ApplicationPath를 사용해야합니다.
Warlock

기본 URL은 httpx : //domain.com : [port] /입니다.이 솔루션에 앱 경로를 직접 추가해야합니다
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를 호스트와 독립적으로 사용하십시오.
Darrel Miller

5

나에게 @warlock은 지금까지 가장 좋은 대답처럼 보이지만 과거에는 항상 이것을 사용했습니다.

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

또는 WebAPI 컨트롤러에서;

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

원하는 이스케이프 형식을 선택할 수있어 편리합니다. 왜 두 가지 다른 구현이 있는지 분명하지 않으며,이 방법과 @ warlock 's 가이 경우에도 동일한 결과를 반환하지만 GetLeftPart()서버 비 Uri의 mailto태그 와 같은 경우 에도 작동 하는 것처럼 보입니다. .


ngrok 터널과 https 뒤에있는 경우 잘못된 URL을 반환합니다.
Mohammad Zekrallah


4

나는 함께 간다

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

1
프로토콜이 추가됩니다 : (HttpContext.Request.ServerVariables [ "HTTPS"] == "off"? "http : //": "https : //") + HttpContext.Request.ServerVariables [ "HTTP_HOST"]
onemorecupofcoffee

4

Warlock이 작성한 내용에 따라 웹 루트에서 호스팅되지 않으면 가상 경로 루트가 필요하다는 것을 알았습니다. (이것은 MVC 웹 API 컨트롤러에서 작동합니다)

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

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 배포에서 "application name"을 반환합니다.

따라서 도메인 이름에 액세스하려면 다음과 같은 경우 응용 프로그램 이름을 포함시키는 것을 고려하십시오.

  1. IIS 배포
  2. 응용 프로그램이 하위 도메인에 배포 된 경우

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

dev.x.us/web의 경우

이 강력한 텍스트를 반환


0

아래 코드를 사용하십시오                           

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

다른 사용자가 해당 기능을 이해할 수 있도록 코드를 설명하십시오. 감사!
Ignacio Ara


-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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.