Bagaimana saya bisa mendapatkan baseurl situs?


183

Saya ingin menulis metode pembantu kecil yang mengembalikan URL dasar situs. Inilah yang saya pikirkan:

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

Apakah ada kesalahan dalam hal ini, yang dapat Anda pikirkan? Adakah yang bisa memperbaiki ini?



Jawaban:


324

Coba ini:

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

13
Ini adalah satu-satunya jawaban yang saya temukan yang berhubungan dengan kasus di mana sebuah situs aplikasi yang merupakan anak dari situs web tingkat atas di IIS.
John

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

2
Request.Url.Scheme tidak selalu berfungsi ketika Anda memiliki http internal yang dikonfigurasi dan terminasi SSL diatur untuk https secara internal di server, tetapi menjalankan https * di luar. Untuk menyiasatinya, saya cukup membuat Kunci AppSetting khusus lingkungan "UrlScheme" dengan nilai "http" atau "https" berdasarkan di mana situs web berada. Pengaturan ini di web.config dapat diakses oleh ConfigurationManager.AppSettings ["Key"]
Ben Sewards

3
Ini tidak memperhitungkan penyeimbangan muatan akun, tempat dekripsi terjadi, atau meneruskan proksi. Anda dapat berakhir dengan alamat yang salah menggunakan ini, jadi berhati-hatilah dan ketahui di mana situs web Anda telah digunakan.
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)

Itu dia ;)


25
Ini tidak berfungsi untuk Jalur Virtual atau Aplikasi. Anda harus menggunakan Request.ApplicationPath di samping bagian kiri.
Warlock

url dasar adalah httpx: //domain.com: [port] / Anda harus menambahkan sendiri jalur aplikasi ke solusi ini
Pawel Cioch

9

Sayangnya, GetLeftPartsolusi populer tidak didukung dalam versi PCL Uri. GetComponentsadalah, bagaimanapun, jadi jika Anda membutuhkan portabilitas, ini harus melakukan trik:

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

6

Saya percaya bahwa jawaban di atas tidak mempertimbangkan ketika situs tersebut tidak berada di root situs web.

Ini adalah untuk pengontrol WebApi:

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

Dari dalam controller gunakan Configuration.VirtualPathRoot karena merupakan host yang independen.
Darrel Miller

5

Bagi saya, @ warlock sepertinya jawaban terbaik di sini sejauh ini, tapi saya selalu menggunakan ini di masa lalu;

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

Atau di pengontrol WebAPI;

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

yang berguna sehingga Anda dapat memilih format apa yang Anda inginkan. Saya tidak jelas mengapa ada dua implementasi yang berbeda, dan sejauh yang saya tahu, metode ini dan @ warlock mengembalikan hasil yang sama persis dalam kasus ini, tetapi sepertinya GetLeftPart()juga akan berfungsi untuk mailtotag non-server seperti Uri misalnya .


mengembalikan url yang tidak valid untuk kasus-kasus di mana Anda berada di belakang terowongan ngrok dan https
Mohammad Zekrallah


4

saya pergi dengan

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

1
Ini akan menambahkan protokol: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "Http: //": "https: //") + HttpContext.Request.ServerVariables ["HTTP_HOST"]
onemorecupofcoffee

4

Berdasarkan apa yang ditulis Warlock, saya menemukan bahwa root path virtual diperlukan jika Anda tidak di-host di root web Anda. (Ini berfungsi untuk pengontrol API Web MVC)

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

1

Saya menggunakan kode berikut dari Application_Start

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


1

Ini bekerja untuk saya.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : mengembalikan jalur lengkap sama dengan yang ditampilkan browser.
  • Request.Url.PathAndQuery : kembalikan (path lengkap) - (nama domain + PORT).
  • Request.ApplicationPath : mengembalikan "/" pada server yang dihosting dan "nama aplikasi" pada penyebaran IIS lokal.

Jadi, jika Anda ingin mengakses nama domain Anda, pertimbangkan untuk memasukkan nama aplikasi jika:

  1. Penyebaran IIS
  2. Jika aplikasi Anda dikerahkan di sub-domain.

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

Untuk dev.x.us/web

itu mengembalikan teks yang kuat ini


0

Silakan gunakan kode di bawah ini                           

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

Tolong jelaskan kode Anda sehingga pengguna lain dapat memahami fungsinya. Terima kasih!
Ignacio Ara


-2

Anda bisa menambahkan port untuk non port 80 / SSL?

sesuatu seperti:

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

dan menggunakannya dalam hasil akhir?


6
Request.Url.Authorityakan memasukkan nomor port jika tidak standar
Andomar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.