ASP.NET中URL重写后如何获取地址栏真实URL及设置Meta标签
解决ASP.NET URL重写后获取显示URL及设置Meta标签的问题
嘿,我来帮你搞定这个问题!
一、获取地址栏显示的重写后URL
首先得说清楚为什么你用HttpContext.Current.Request.Url.PathAndQuery拿到的是原始URL:URL重写是服务器端的内部跳转逻辑,Request.Url保存的是服务器实际接收到的请求地址(也就是search.aspx?cat=1),而地址栏显示的是浏览器发送的重写后的URL,服务器默认不会主动把这个值存在Request上下文里。
针对你自己编写的重写逻辑,最简单的解决办法是在重写过程中把最终显示的URL存储到HttpContext.Items集合中,这样后续页面就能轻松获取到这个值。
修改你的重写代码,加入存储逻辑:
m_boolIsCustomPage = true; m_strPageBaseUrl = "search.aspx"; // 这里替换成你实际生成的重写后URL,比如根据cat=1动态拼接分类名路径 string rewrittenUrl = "/search/cameras"; // 把重写后的URL存入Context.Items,方便页面后续调用 HttpContext.Current.Items["DisplayUrl"] = rewrittenUrl; if (m_intIDSearch > -1) { l_strQueryContents = m_intIDSearch.ToString(); m_intIDSearch = -1; } else { l_strQueryContents = "-1"; m_intIDSearch = -1; }
然后在页面中获取这个值:
string displayUrl = HttpContext.Current.Items["DisplayUrl"] as string; // 现在displayUrl就是地址栏显示的/search/cameras了
二、如果无法获取重写URL,如何给特定页面设置Meta标签
如果因为某些限制没法拿到显示的URL,也有几种可靠的方法来设置对应页面的Meta标签:
1. 根据原始请求参数/标识判断
既然你是通过重写把cat=1转换成了相机分类页面,那可以直接用原始的参数(或者你重写逻辑里的m_intIDSearch)来判断页面类型,然后设置对应的Meta:
protected void Page_Load(object sender, EventArgs e) { int categoryId = m_intIDSearch; // 从你的重写逻辑中获取分类ID if (categoryId == 1) { // 设置相机分类的Meta标签 HtmlMeta metaTitle = new HtmlMeta(); metaTitle.Name = "title"; metaTitle.Content = "相机搜索 - 我的网站"; Page.Header.Controls.Add(metaTitle); HtmlMeta metaDesc = new HtmlMeta(); metaDesc.Name = "description"; metaDesc.Content = "浏览我们的相机产品,找到适合你的摄影设备"; Page.Header.Controls.Add(metaDesc); } // 其他分类同理扩展 }
2. 用页面基类统一处理
创建一个页面基类,在基类的生命周期事件中处理Meta标签逻辑,然后让所有需要设置Meta的页面继承这个基类:
public class BasePage : System.Web.UI.Page { protected override void OnLoad(EventArgs e) { base.OnLoad(e); // 根据当前页面或参数判断,设置对应的Meta if (this is SearchPage) { int categoryId = GetCategoryId(); // 自定义方法获取分类ID // 加载对应分类的Meta内容 SetMetaTags(categoryId); } } private void SetMetaTags(int categoryId) { // 这里可以从数据库或配置文件中读取对应分类的Meta信息 string title = "", desc = ""; switch(categoryId) { case 1: title = "相机搜索"; desc = "相机产品搜索页面,包含各类品牌相机"; break; // 其他分类的配置 } HtmlMeta metaTitle = new HtmlMeta(); metaTitle.Name = "title"; metaTitle.Content = title; Page.Header.Controls.Add(metaTitle); HtmlMeta metaDesc = new HtmlMeta(); metaDesc.Name = "description"; metaDesc.Content = desc; Page.Header.Controls.Add(metaDesc); } }
3. 直接在ASPX页面中动态绑定
如果是简单场景,也可以直接在ASPX页面的Head部分用服务器代码绑定:
<head runat="server"> <title><%= GetPageTitle() %></title> <meta name="description" content="<%= GetPageDescription() %>" /> </head>
然后在后台代码中实现GetPageTitle()和GetPageDescription()方法,根据分类ID返回对应内容即可。
内容的提问来源于stack exchange,提问作者Aneeq Azam Khan
相关产品推荐
相关产品推荐

