programing

사이트의 기본 URL을 어떻게 알 수 있습니까?

showcode 2023. 5. 20. 11:02
반응형

사이트의 기본 URL을 어떻게 알 수 있습니까?

사이트의 기본 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;
}

여기서 혹시 생각할 수 있는 실수가 있습니까?누가 이것을 개선할 수 있습니까?

사용해 보십시오.

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

바로 그거야 ;)

대중적인GetLeftPart의 PCL 버전에서는 솔루션이 지원되지 않습니다.Uri,불행하게도. GetComponents그러나 휴대성이 필요한 경우에는 다음과 같은 이점이 있습니다.

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

이것은 훨씬 더 확실한 방법입니다.

VirtualPathUtility.ToAbsolute("~/");

위의 답변은 사이트가 웹사이트의 루트에 없을 때 고려하지 않는다고 생각합니다.

이것은 WebApi 컨트롤러용입니다.

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

제가 보기에 @warlock's는 지금까지 여기서 가장 좋은 답처럼 보이지만, 저는 항상 과거에 이것을 사용했습니다.

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

또는 WebAPI 컨트롤러에서;

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

어떤 탈출 형식을 원하는지 선택할 수 있도록 편리합니다.왜 그렇게 다른 구현이 두 개인지 명확하지 않으며, 제가 알기로는 이 방법과 @warlock은 이 경우에 정확히 같은 결과를 반환합니다. 하지만 보기에는GetLeftPart()또한 URI와 같은 비서버에서도 작동합니다.mailto예를 들어 태그입니다.

찬성합니다

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

Warlock이 작성한 내용을 바탕으로 웹 루트에 호스팅되지 않는 경우 가상 경로 루트가 필요하다는 것을 알게 되었습니다. (MVC 웹 API 컨트롤러에 적용됩니다.)

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

Application_Start의 다음 코드를 사용하고 있습니다.

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

이것은 나에게 효과가 있습니다.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • 요청합니다.Url.OriginalString: 브라우저에 표시된 것과 동일한 전체 경로를 반환합니다.
  • 요청합니다.Url.PathAndQuery: (완전한 경로) - (도메인 이름 + PORT)를 반환합니다.
  • 요청합니다.ApplicationPath: 호스트된 서버에서 "/"을 반환하고 로컬 IIS 배포에서 "애플리케이션 이름"을 반환합니다.

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

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

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

dev.x.us/web 의 경우

이 강한 텍스트를 반환합니다.

아래 코드를 사용하십시오.

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

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

그리고 그것을 최종 결과에 사용합니까?

언급URL : https://stackoverflow.com/questions/7413466/how-can-i-get-the-baseurl-of-site

반응형