如何获取网站的baseurl?

Posted

技术标签:

【中文标题】如何获取网站的baseurl?【英文标题】:How can I get the baseurl of site? 【发布时间】: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;

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

【问题讨论】:

查看***.com/questions/3933662/… How can I get my webapp's base URL in ASP.NET MVC?的可能重复 【参考方案1】:

试试这个:

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

【讨论】:

这是我发现的唯一解决方案,即网站是 IIS 中***网站的子应用程序。 string.Format("01/", 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("~/");

【讨论】:

@Daniel 调用不会简单地返回 / 如果您托管在某些应用程序域中,例如 yourserver/yourapplicationname/yourrootpath @vibs2006 是的,这是一个模棱两可的问题【参考方案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 部署上返回“应用程序名称”。

因此,如果您想访问您的域名,请考虑在以下情况下包含应用程序名称:

    IIS 部署 如果您的应用程序部署在子域上。

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

对于 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 将包含非标准端口号

以上是关于如何获取网站的baseurl?的主要内容,如果未能解决你的问题,请参考以下文章

如何在nuxt中获取axios baseUrl?

如何使用 vue 路由器在 Vuejs 方法中获取 baseURL?

如何从“每一页”中获取“页面链接”?

JS Axios - 如何在发生错误时获取响应正文?

如何从服务器获取 AFNetworking 中的完整响应字符串?

用 PHP Rest API 反应 axios,如何编写 baseurl [重复]