Jaggu
Jaggu

Reputation: 6428

How can I get the baseurl of site?

I want to write a little helper method which returns the base URL of the site. This is what I came up with:

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

Is there any mistake in this, that you can think of? Can anyone improve upon this?

Upvotes: 202

Views: 317012

Answers (13)

Michał Różycki
Michał Różycki

Reputation: 327

You can use UriHelper.BuildAbsolute

UriHelper.BuildAbsolute(HttpContext.Request.Scheme, HttpContext.Request.Host, HttpContext.Request.PathBase);

Upvotes: 0

FAHID
FAHID

Reputation: 3385

This works for me.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString: return the complete path same as browser showing.
  • Request.Url.PathAndQuery: return the (complete path) - (domain name + PORT).
  • Request.ApplicationPath: return "/" on hosted server and "application name" on local IIS deploy.

So if you want to access your domain name do consider to include the application name in case of:

  1. IIS deployment
  2. If your application deployed on the sub-domain.

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

For the dev.x.us/web

it return this strong text

Upvotes: 1

Pranav Joseph
Pranav Joseph

Reputation: 11

Please use the below code                           

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

Upvotes: 1

Crispijn Lange
Crispijn Lange

Reputation: 19

I'm using following code from Application_Start

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

Upvotes: 1

SpazDude
SpazDude

Reputation: 924

Based on what Warlock wrote, I found that the virtual path root is needed if you aren't hosted at the root of your web. (This works for MVC Web API controllers)

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

Upvotes: 4

Talha
Talha

Reputation: 1636

I go with

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

Upvotes: 4

Todd Menier
Todd Menier

Reputation: 39289

The popular GetLeftPart solution is not supported in the PCL version of Uri, unfortunately. GetComponents is, however, so if you need portability, this should do the trick:

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

Upvotes: 11

Daniel A. White
Daniel A. White

Reputation: 190907

This is a much more fool proof method.

VirtualPathUtility.ToAbsolute("~/");

Upvotes: 7

rufo
rufo

Reputation: 5537

I believe that the answers above doesn't consider when the site is not in the root of the website.

This is a for WebApi controller:

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

Upvotes: 7

cirrus
cirrus

Reputation: 5662

To me, @warlock's looks like the best answer here so far, but I've always used this in the past;

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

Or in a WebAPI controller;

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

which is handy so you can choose what escaping format you want. I'm not clear why there are two such different implementations, and as far as I can tell, this method and @warlock's return the exact same result in this case, but it looks like GetLeftPart() would also work for non server Uri's like mailto tags for instance.

Upvotes: 6

Warlock
Warlock

Reputation: 7471

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

That's it ;)

Upvotes: 177

Frank Allenby
Frank Allenby

Reputation: 4392

Try this:

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

Upvotes: 370

Mark Redman
Mark Redman

Reputation: 24515

you could possibly add in the port for non port 80/SSL?

something like:

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

and use that in the final result?

Upvotes: -2

Related Questions