如何获得网站的基本网址?


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

您是否会想到其中的任何错误?任何人都可以对此进行改进吗?



Answers:


324

试试这个:

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

13
这是我发现的唯一答案,它涉及一个站点,该站点是IIS中顶级网站的子级应用程序。
约翰,

6
的String.Format( “{0} {1} /”,Request.Url.GetLeftPart(UriPartial.Authority),Request.ApplicationPath.TrimEnd(
diegohb

2
如果在服务器上内部配置了内部http并为https设置了SSL终止,但在外部运行https *,则Request.Url.Scheme并不总是起作用。为了解决这个问题,我只是简单地根据网站所在的位置制作了一个特定于环境的AppSetting键“ UrlScheme”,其值为“ http”或“ https”。web.config中的此设置可以由ConfigurationManager.AppSettings [“ Key”]
Ben Sewards 2014年

3
这没有考虑到负载平衡,发生解密或转发代理的情况。使用此地址可能会导致地址错误,因此请小心并知道将网站部署到的位置。
Conor Gallagher 2015年

$“ {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)

而已 ;)


25
这不适用于虚拟路径或应用程序路径。除了左侧部分,还应该使用Request.ApplicationPath。
术士

基本网址是httpx://domain.com:[port] /,您必须将应用程序路径自己添加到此解决方案中
Pawel Cioch 2016年

9

不幸的GetLeftPartUri,PCL版本不支持该流行的解决方案。GetComponents但是,因此,如果您需要可移植性,则可以做到这一点:

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

6

我认为,当网站不在网站根目录中时,不会考虑上述答案。

这是用于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)

这很方便,因此您可以选择所需的转义格式。我不清楚为什么会有两个这样的不同实现,而且据我所知,在这种情况下,此方法和@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

根据Warlock撰写的内容,我发现,如果不将虚拟路径的根目录托管在Web的根目录下,则需要该目录。(这适用于MVC Web API控制器)

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

1

我正在使用Application_Start中的以下代码

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


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

它返回此强文本




-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 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.