我想在 asp.net 中设置 URL Masking 以隐藏 URL 中的页面名称和查询字符串。
目前我正在设置下面的代码以在全局应用程序文件中执行 url 重写。
routeCollection.MapPageRoute("Login", "Login", "~/frmLogin.aspx");
但我想以一种只向最终用户显示域名的方式重写 URL。 http://www.domainname.com - 像这样
请帮我设置它。
提前致谢,
我想在 asp.net 中设置 URL Masking 以隐藏 URL 中的页面名称和查询字符串。
目前我正在设置下面的代码以在全局应用程序文件中执行 url 重写。
routeCollection.MapPageRoute("Login", "Login", "~/frmLogin.aspx");
但我想以一种只向最终用户显示域名的方式重写 URL。 http://www.domainname.com - 像这样
请帮我设置它。
提前致谢,
您可以将 frmLogin.aspx 页面设置为 Web 服务器中的默认页面。
如果您使用的是 IIS 7,步骤如下:
1.Select your website
2. In description click on default document
3. Add your page (frmLogin.aspx) in and set its priority.
我们在我们的应用程序中使用以下方法在域上简单地显示标志页。它也可以针对其他页面进行修改。
在 Global.asax 中:
routeCollection.MapPageRoute("SIGNIN", String.Empty, "~/signin.aspx");
If you use domain masking then there are no code changes and you achieve the same result.
我为实验目的尝试了以下方法。所以我不知道它在回发的复杂页面上会如何表现。
当您请求 www.domainname.com 时,实际请求将转到 www.domainname.com /default.aspx 或您设置的任何其他默认页面。在默认页面加载中,第一件事是检查任何名为“pagetoview”的会话,如果已设置,则 server.transfer 到该页面,否则服务器默认页面。
现在假设用户从页面转到 form.aspx'。form.aspx 加载方法应检查 pagetoview 会话变量是否与当前页面名称相同,然后取消设置并继续,否则将 pagetoview 变量设置为当前页面名称并重定向到域。
那里会检查默认页面并会发生 server.transfer。希望您对这种奇怪的方法有所了解。
您应该使用 cookie 和用户控件模拟 asp.net 路由。所以我们只有一个名为 default.aspx 的 aspx 文件,其他页面应放入用户控件中。将此脚本放在 default.aspx 的末尾:
<script src="https://code.jquery.com/jquery-2.2.0.min.js" type="text/javascript"></script>
<script>
$(document).ready(function () {
$("a").click(function (e) {
e.preventDefault();
var attrHref = $(this).attr("href");
$.getJSON("/service.asmx/SetRouteCookie", { href: attrHref }, function (e) {
window.location.reload();
});
});
});
</script>
此脚本禁用所有链接行为,然后我们手动处理点击事件。在单击事件中,我们通过 ajax 调用 Web 服务方法。该服务设置了一个特定的 cookie 来保存当前页面:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, XmlSerializeString = false, UseHttpGet = true)]
public void SetRouteCookie()
{
if (HttpContext.Current.Request.QueryString["href"] != null)
{
string href = HttpContext.Current.Request.QueryString["href"];
HttpCookie c = new HttpCookie("CurrentRoute", href);
c.Expires = DateTime.Now.AddHours(1);
HttpContext.Current.Response.Cookies.Add(c);
HttpContext.Current.Response.ContentType = "application/json";
HttpContext.Current.Response.Write("{\"status\":\"ok\"}");
}
}
创建 cookie 并成功回调后,我们通过 javascript 重新加载页面。在默认的 Page_Load 事件中,我们加载适当的用户控件:
protected void Page_Load(object sender, EventArgs e)
{
#region process route
if (HttpContext.Current.Request.Cookies["CurrentRoute"] != null)
{
var route = HttpContext.Current.Request.Cookies["CurrentRoute"].Value.ToString();
string pageName = GetPageName(route);
Placeholder1.Controls.Add(LoadControl("/ctrls/" + pageName + ".ascx"));
}
else
{
Placeholder1.Controls.Add(LoadControl("/ctrls/default.ascx"));
}
#endregion
}
public string GetPageName(string href)
{
int index = href.IndexOf("&");
if (index == -1)
return href.Trim('/');
else
{
return href.Substring(0, index).Trim('/');
}
}
我在 git 上创建了示例代码: HideRoute
您应该使用 Server.Transfer 方法,例如您在 default.aspx 写入事件中有 asp.net 按钮,如下所示:
Server.Transfer("/login.aspx?q1=testQuery");
使用这种方法,您的 url 不会更改,并且在 login.aspx 中您可以获取查询字符串