如何获取网站的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.Current.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?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 vue 路由器在 Vuejs 方法中获取 baseURL?