Làm thế nào tôi có thể có được cơ sở của trang web?


183

Tôi muốn viết một phương thức trợ giúp nhỏ trả về URL cơ sở của trang web. Đây là những gì tôi nghĩ ra:

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

Có bất kỳ sai lầm trong điều này, mà bạn có thể nghĩ đến? Bất cứ ai có thể cải thiện điều này?



Câu trả lời:


324

Thử cái này:

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

13
Đây là câu trả lời duy nhất tôi thấy có liên quan đến trường hợp một trang web là ứng dụng con của một trang web cấp cao nhất trong IIS.
John

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

2
Request.Url.Scheme không phải lúc nào cũng hoạt động khi bạn đã cấu hình http nội bộ và chấm dứt SSL được thiết lập cho https bên trong máy chủ, nhưng chạy https * bên ngoài. Để giải quyết vấn đề này, tôi chỉ cần tạo một Khóa ứng dụng cụ thể cho môi trường "UrlScheme" với giá trị là "http" hoặc "https" dựa trên vị trí của trang web. Cài đặt này trong web.config có thể được truy cập bởi Cấu hình Trình quản lý. Cài đặt ["Khóa"]
Ben Sewards

3
Điều này không tính đến cân bằng tải tài khoản, nơi xảy ra quá trình giải mã hoặc chuyển tiếp proxy. Bạn có thể kết thúc với một địa chỉ không chính xác bằng cách sử dụng địa chỉ này, vì vậy hãy cẩn thận và biết nơi trang web của bạn đã được triển khai.
Conor Gallagher

$ "{System.Web.HttpContext.‌ Current.Request.Url.GetLeftPart (UriPartial.Authority)} {System.Web.HttpContext.Cur‌ thuê.Request.ApplicationPath? .TrimEnd ('/')} /";
Ryan Penprint

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

Đó là nó ;)


25
Điều này không hoạt động cho Đường dẫn ảo hoặc Ứng dụng. Bạn nên sử dụng Request.ApplicationPath ngoài phần bên trái.
Warlock

url cơ sở là httpx: //domain.com: [port] / bạn phải tự thêm đường dẫn ứng dụng vào giải pháp này
Pawel Cioch

9

Thật không may, GetLeftPartgiải pháp phổ biến không được hỗ trợ trong phiên bản PCL Uri. GetComponentslà, tuy nhiên, vì vậy nếu bạn cần tính di động, điều này nên thực hiện mẹo:

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

6

Tôi tin rằng các câu trả lời ở trên không xem xét khi trang web không nằm trong thư mục gốc của trang web.

Đây là một bộ điều khiển WebApi:

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

Từ bên trong bộ điều khiển, sử dụng Cấu hình.VirtualPathRoot vì nó là máy chủ độc lập.
Darrel Miller

5

Đối với tôi, @ warlock trông giống như câu trả lời hay nhất ở đây cho đến nay, nhưng tôi đã luôn sử dụng nó trong quá khứ;

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

Hoặc trong bộ điều khiển WebAPI;

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

đó là tiện dụng để bạn có thể chọn định dạng thoát mà bạn muốn. Tôi không rõ tại sao có hai cách triển khai khác nhau như vậy và theo như tôi có thể nói, phương thức này và @ warlock sẽ trả lại kết quả chính xác như nhau trong trường hợp này, nhưng có vẻ như GetLeftPart()cũng sẽ hoạt động cho các mailtothẻ giống như máy chủ của Uri .


trả về url không hợp lệ cho các trường hợp bạn đứng sau đường hầm ngrok và https
Mohammad Zekrallah


4

tôi đi với

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

1
Điều này sẽ thêm giao thức: (HttpContext.Request.ServerVariabled ["HTTPS"] == "off"? "Http: //": "https: //") + HttpContext.Request.ServerVariabled ["HTTP_HOST"]
onemorecupofcoffee

4

Dựa trên những gì Warlock đã viết, tôi thấy rằng root đường dẫn ảo là cần thiết nếu bạn không được lưu trữ tại thư mục gốc của trang web. (Điều này hoạt động cho bộ điều khiển API Web MVC)

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

1

Tôi đang sử dụng mã sau từ Application_Start

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


1

Điều này làm việc cho tôi.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OrigenString : trả về đường dẫn hoàn chỉnh giống như trình duyệt hiển thị.
  • Request.Url.PathAndQuery : trả về (đường dẫn đầy đủ) - (tên miền + PORT).
  • Request.ApplicationPath : return "/" trên máy chủ được lưu trữ và "tên ứng dụng" khi triển khai IIS cục bộ.

Vì vậy, nếu bạn muốn truy cập tên miền của mình, hãy xem xét để bao gồm tên ứng dụng trong trường hợp:

  1. Triển khai IIS
  2. Nếu ứng dụng của bạn triển khai trên tên miền phụ.

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

Dành cho nhà phát triển.x.us / web

nó trả lại văn bản mạnh mẽ này


0

Vui lòng sử dụng mã dưới đây                           

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

Vui lòng giải thích mã của bạn để người dùng khác có thể hiểu chức năng của nó. Cảm ơn!
Ignacio Ara


-2

bạn có thể thêm vào cổng cho cổng không 80 / SSL không?

cái gì đó như:

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

và sử dụng nó trong kết quả cuối cùng?


6
Request.Url.Authoritysẽ bao gồm số cổng nếu nó không chuẩn
Andomar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.