【问题标题】:How can I get the baseurl of site?如何获取网站的baseurl?
【发布时间】:2011-11-16 19:51:24
【问题描述】:

我想编写一个返回站点基本 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;
}

你能想到这里有什么错误吗?任何人都可以对此进行改进吗?

【问题讨论】:

标签: c# asp.net uri httprequest


【解决方案1】:

试试这个:

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

【讨论】:

  • 这是我发现的唯一解决方案,即网站是 IIS 中顶级网站的子应用程序。
  • string.Format("{0}{1}/", Request.Url.GetLeftPart(UriPartial.Authority), Request.ApplicationPath.TrimEnd('/'))
  • Request.Url.Scheme 在您在服务器内部配置了内部 http 并为 https 设置 SSL 终止,但在外部运行 https* 时并不总是有效。为了解决这个问题,我只是根据网站所在的位置创建了一个特定于环境的 AppSetting Key“UrlScheme”,其值为“http”或“https”。 web.config中的这个设置可以通过ConfigurationManager.AppSettings["Key"]访问
  • 这不考虑负载平衡、解密发生的位置或转发代理。您最终可能会得到一个不正确的地址,因此请小心并了解您的网站已部署到何处。
  • $"{System.Web.HttpContext.‌​Current.Request.Url.GetLeftPart(UriPartial.Authority)}{System.Web.HttpContext.Cur‌​rent.Request.ApplicationPath?.TrimEnd( '/')}/";
【解决方案2】:
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

就是这样;)

【讨论】:

  • 这不适用于虚拟或应用程序路径。除了左侧部分之外,您还应该使用 Request.ApplicationPath。
  • base url 是 httpx://domain.com:[port]/ 你必须自己添加应用路径到这个解决方案
【解决方案3】:

很遗憾,Uri 的 PCL 版本不支持流行的 GetLeftPart 解决方案。但是,GetComponents 是,所以如果您需要可移植性,这应该可以解决问题:

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

【讨论】:

    【解决方案4】:

    我相信上面的答案没有考虑网站不在网站根目录中的情况。

    这是一个用于 WebApi 的控制器:

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

    【讨论】:

    • 从控制器内部使用 Configuration.VirtualPathRoot,因为它独立于主机。
    【解决方案5】:

    对我来说,@warlock's 看起来是迄今为止最好的答案,但我过去一直使用它;

    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
    【解决方案6】:

    这是一个更简单的方法。

    VirtualPathUtility.ToAbsolute("~/");
    

    【讨论】:

    【解决方案7】:

    我去

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

    【讨论】:

    • 这将添加协议:(HttpContext.Request.ServerVariables["HTTPS"] == "off" ? "http://" : "https://") + HttpContext.Request。服务器变量["HTTP_HOST"]
    【解决方案8】:

    根据 Warlock 所写的内容,我发现如果您没有托管在 Web 的根目录中,则需要虚拟路径根目录。 (这适用于 MVC Web API 控制器)

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

    【讨论】:

      【解决方案9】:

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

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

      【讨论】:

        【解决方案10】:

        这对我有用。

        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

        它返回这个 强文本

        【讨论】:

          【解决方案11】:

          请使用以下代码                          

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

          【讨论】:

          • 请解释您的代码,以便其他用户了解其功能。谢谢!
          【解决方案12】:

          您可以为非端口 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());
                      }
          

          并在最终结果中使用它?

          【讨论】:

          • Request.Url.Authority 将包含非标准端口号
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-22
          • 2019-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多