サイトの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のトップレベルのWebサイトの子であるアプリケーションである場合を扱っています。
John

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

2
内部のhttpが構成され、サーバーの内部でhttpsに対してSSLターミネーションが設定されているが、外部でhttps *を実行している場合、Request.Url.Schemeは常に機能するとは限りません。これを回避するために、ウェブサイトの場所に基づいて、「http」または「https」のいずれかの値を持つ環境固有のAppSettingキー「UrlScheme」を作成しました。web.configのこの設定には、ConfigurationManager.AppSettings ["Key"]によってアクセスできます
Ben Sewards

3
これは、復号化が発生する負荷分散やフォワードプロキシを考慮していません。これを使用すると、誤ったアドレスになる可能性があるため、注意して、Webサイトがどこに展開されたかを確認してください。
Conor Gallagher

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

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

それでおしまい ;)


25
これは、仮想パスまたはアプリケーションパスでは機能しません。左側の部分に加えて、Request.ApplicationPathを使用する必要があります。
ウォーロック

ベースURLはhttpx://domain.com:[port] /です。このソリューションに自分でアプリのパスを追加する必要があります
Pawel Cioch

9

残念ながら、この一般的なGetLeftPartソリューションはPCLバージョンのではサポートされていませんUriGetComponentsただし、移植性が必要な場合は、これでうまくいくはずです。

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

6

上記の回答では、サイトがWebサイトのルートにない場合は考慮されないと思います。

これは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)

これは便利なので、必要なエスケープ形式を選択できます。なぜこのような2つの異なる実装があるのか​​は明確ではありません。私が知る限り、このメソッドと@warlockはこの場合まったく同じ結果を返しますが、たとえば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

ウォーロックが書いたことに基づいて、私はあなたがあなたのウェブのルートでホストされていないなら仮想パスルートが必要であることがわかりました。(これはMVC Web APIコントローラーで機能します)

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


1

これでうまくいきます。

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString:ブラウザが表示しているのと同じ完全なパスを返します。
  • Request.Url.PathAndQuery:(完全なパス)-(ドメイン名+ PORT)を返します。
  • Request.ApplicationPath:ホストサーバーでは "/"を返し、ローカルIIS展開では "アプリケーション名"を返します。

したがって、ドメイン名にアクセスする場合は、次の場合にアプリケーション名を含めることを検討してください。

  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.