如何使用javascript获取基本网址?
例如,当我从visual studio浏览我的网站时,如果我的网址是http://localhost:20201/home/index
,我希望获得http://localhost:20201
如果我在IIS上托管我的网站,并且我的虚拟目录名称是MyApp且网址为http://localhost/MyApp/home/index
,我希望获得http://localhost/MyApp
我尝试使用location.protocol
+ location.hostname
(以及location.host
),当我通过visual studio浏览我的网站时,它们工作正常,但当我在IIS上托管它时,我得到{{ 1}},/ MyApp被截断。
答案 0 :(得分:32)
您应该避免在JavaScript中进行此类检测,而是从.NET代码中传递值。你总是冒险遇到像http://server/MyApp/MyApp/action
这样的网址问题,你不知道哪个是控制器的名称以及应用程序的路径。
在Layout.cshtml文件中(或您需要的任何地方)添加以下代码:
<script type="text/javascript">
window.applicationBaseUrl = @Html.Raw(HttpUtility.JavaScriptStringEncode(Url.Content("~/"), true));
alert(window.applicationBaseUrl + "asd.html");
// if you need to include host and port in the url, use this:
window.applicationBaseUrl = @Html.Raw(HttpUtility.JavaScriptStringEncode(
new Uri(
new Uri(this.Context.Request.Url.GetLeftPart(UriPartial.Authority)),
Url.Content("~/")
).ToString(), true));
alert(window.applicationBaseUrl + "asd.html");
</script>
需要new Uri()
部分,以便始终正确组合网址(无需手动检查每个部分是否以/
符号开头或结尾)。
答案 1 :(得分:2)
var url = window.location.href.split('/');
var baseUrl = url[0] + '//' + url[2];
答案 2 :(得分:2)
我不认为这是可能的,因为JavaScript(客户端)对您的部署(MyApp)一无所知,并将其视为pathinfo的一部分(就像/ home / index一样)。作为一种解决方法,您可以尝试根据域或端口解释pathinfo(location.pathname)。
但是你可以在包含路径的全局范围(或任何适合你的范围)中设置一个JavaScript变量(路径由服务器生成并放入变量中)。
这可能在你的html-Head中看起来像那样:
<script type="text/javascript">
var global_baseurl = '<insert server side code that gets the path depending on your server side programming language>';
</script>
答案 3 :(得分:1)
请尝试以下代码。
function getBaseURL() {
var url = location.href; // entire url including querystring - also: window.location.href;
var baseURL = url.substring(0, url.indexOf('/', 14));
if (baseURL.indexOf('http://localhost') != -1) {
// Base Url for localhost
var url = location.href; // window.location.href;
var pathname = location.pathname; // window.location.pathname;
var index1 = url.indexOf(pathname);
var index2 = url.indexOf("/", index1 + 1);
var baseLocalUrl = url.substr(0, index2);
return baseLocalUrl + "/";
}
else {
// Root Url for domain name
return baseURL + "/";
}
}
document.write(getBaseURL());
谢谢,
希瓦
答案 4 :(得分:1)
如果您使用的是.NET Core,则可以在全局范围内获取url设置JavaScript变量(例如,在Layout.cshtml文件中,此文件位于“视图/共享”文件夹中):
<script type="text/javascript">
var url = '@string.Format("{0}://{1}{2}", Context.Request.Scheme, Context.Request.Host.Value , Url.Content("~/"))';
</script>
从带有插值的C#6版本开始:
<script type="text/javascript">
var url = '@($"{Context.Request.Scheme}://{Context.Request.Host.Value}{Url.Content("~/")}")';
</script>
答案 5 :(得分:0)
您可以在页面的 head 标记中设置基本网址。所有链接/ href都将使用它来调用relatieve hrefs。
@{ var baseHref = new System.UriBuilder(Request.Url.AbsoluteUri) { Path = Url.Content("~/") }; }
<base href="@baseHref" />
说明:
答案 6 :(得分:0)
我认为一个干净的解决方案就像
在_layout
Html中设置基本网址
<div id="BaseUrl" data-baseurl="@Context.Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/")"></div>
Context.Request.Url.GetLeftPart(UriPartial.Authority)将为您提供
本地http://localhost:20201 来自IIS将为您提供http://localhost
本地的Url.Content(&#34;〜/&#34;)将为空,但在IIS中会为您提供应用名称,在您的情况下为MyApp
然后从 Js :
var baseUrl = $("#BaseUrl").data("baseurl");
您可以使用赞:
$.getJSON(baseUrl + "/Home/GetSomething", function (data) {
//Do something with the data
});
https://msdn.microsoft.com/en-us/library/system.uri.getleftpart(v=vs.110).aspx http://api.jquery.com/data/
答案 7 :(得分:0)
var base_url = "@Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/")"
在布局文件中定义它并附加base_url。这对我有用。