灵活的URL重写可以让你的网站增加可用性和专业性。在帮助网站更好的被搜索引擎索引收录方面,这也是一个重要的因素。在本篇文章中,我将带你了解如何在ASP.NET中简单的实现URL重写,以及一些常见问题的解决办法。我还将说明为什么URL重写如此重要,以及如何使用它来增强你的网站。
什么是URL重写?
URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是“www.mysite.com/UserProfile/1.aspx”,那么它可以被重写成 “www.mysite.com/UserProfile.aspx?ID=1”这样的URL,这样的网址可以更好的被网站所阅读。
重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力;而且在你改变了自己的网站结构后,无需要求用户修改他们的书签,无需其他网站修改它们的友情链接;它还可以提高你的网站的安全性;而且通常会让你的网站更加便于使用和更专业。关于它的好处,我将在本篇文章的“如何利用URL重写”部分来详细的说明。
如何实现URL重写
URL重写可以通过编程的方式来实现。ASP.NET中的Contex.RewritePath()方法可以让你从程序中实现重写请求的URL。一旦重写后,系统将使用新的路径来继续执行这个请求。
在Global.asax文件的Application_BeginRequest()方法中,你需要增加代码来阅读进来的路径,然后根据一个或多个URL重写规则来成需要进一步处理的路径。下面的例子执行以下URL重写规则:
输入的URL 重写的URL
~/UserAccount./Old.aspx ~/UserAccount./New.aspx
~/UserAccount./{UserId}.aspx ~/UserAccount..aspx?ID={UserId}
代码清单1:使用Contex.RewritePath()实现URL重写
在这个例子中,每次一个新的请求被处理的时候,它将首先查看这个Application_BeginRequest()。通过使用Request.Url属性来获得输入的URL路径,然后通过正则表达式来应用网站URL重写规则,匹配到期望的输入网址后,将它们重写成你希望转向的网址。
当重写规则比较简单且规模比较小的时候,使用Context.RewritePath() 方法以编程的方式重写URL效果比较不错,但是一些大型网站通常有非常多的URL重写规则。手工方式对所有这些重写规则进行编程可能是一件麻烦且容易出错的方法。
URL重写是截取传入Web 请求并自动将请求重定向到其他 URL 的过程。
比如:浏览器发来请求 http://localhost:80/URLRewriter/1.html ,
服务器自动将这个请求中定向为http://localhost:80/URLRewriter/url.aspx?id=1
URLRewriter下载编译后提取其中的URLRewriter.dll和ActionlessForm.dll
一、URL重写
项目引用URLRewriter.dll
web.config配置:
![]()
代码
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><?xml version="1.0"?>
<configurationxmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<configSections>
<sectionname="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler,
URLRewriter"/>
</configSections>
<RewriterConfig>
<Rules>
<RewriterRule>
<LookFor>~/URLRewriter/(.[0-9]*)\.html</LookFor>
<SendTo>~/URLRewriter/url.aspx?id=$1</SendTo>
</RewriterRule>
<RewriterRule>
<LookFor>~/web</LookFor>
<SendTo>~/URLRewriter/url.aspx</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
<system.web>
<httpHandlers>
<!--URLRewriter begin 使用 HTTP 处理程序执行重写-->
<!--<add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
<add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />-->
<!--URLRewriter end-->
</httpHandlers>
<httpModules>
<!--URLRewriter begin 使用 HTTP 模块执行重写-->
<addtype="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter"/>
<!--URLRewriter end-->
</httpModules>
</system.web>
</configuration>
IIS配置:
网站--属性--主目录--配置--插入--C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
将文件是否存在 勾去掉
二、处理PostBack回发
ActionlessForm.dll以重写Form的方式用于处理PostBack回发后URL变为原始地址
项目引用ActionlessForm.dll在页面中注册一下
<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>
将页面中的<form runat="server"></form>替换成:<skm:form id="form1" runat="server"></skm:form>
注:以这种方式处理回发将会在设计器中查看的时候为错误提示Form不可用
所以采用以下方法处理:
在微软的URLRewriter类库中添加以下类之后编译
![]()
代码
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
///<summary>
/// FormRewriter 的摘要说明
///</summary>
namespace URLRewriter.Form
{
publicclass FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
{
public FormRewriterControlAdapter()
{
}
protectedoverridevoid Render(HtmlTextWriter
writer)
{
base.Render(new RewriteFormHtmlTextWriter(writer));
}
}
publicclass RewriteFormHtmlTextWriter : HtmlTextWriter
{
public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
: base(writer)
{
base.InnerWriter= writer.InnerWriter;
}
public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
: base(writer)
{
base.InnerWriter= writer;
}
publicoverridevoid WriteAttribute(string
name,string value,bool fEncode)
{
//If the attribute we are writing is the "action" attribute, and we are not on a sub-control,
//then replace the value to write with the raw URL of the request - which ensures that we'll
//preserve the PathInfo value on postback scenarios
if (name=="action")
{
HttpContext context = HttpContext.Current;
if (context.Items["ActionAlreadyWritten"]==null)
{
//We will use the Request.RawUrl property within ASP.NET to retrieve the origional
//URL before it was re-written.
value = context.Request.RawUrl;
//Indicate that we've already rewritten the <form>'s action attribute to prevent
//us from rewriting a sub-control under the <form> control
context.Items["ActionAlreadyWritten"]=true;
}
}
base.WriteAttribute(name, value, fEncode);
}
}
}
在App_Browsers文件夹下创建Form.browser
![]()
代码
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><browsers>
<browserrefID="Default">
<controlAdapters>
<adaptercontrolType="System.Web.UI.HtmlControls.HtmlForm"
adapterType="URLRewriter.Form.FormRewriterControlAdapter"/>
</controlAdapters>
</browser>
</browsers>
这样就不需要引用ActionlessForm.dll也不需要改变Form了,只要引用URLRewriter.dll就可以了
三、在处理重写成html的时候本来网站中的html页面将会不能使用
使用以上方式将不存在找个问题
如果还不行可以在<compilation debug="true">节点下添加
<buildProviders>
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
在<httpHandlers>节点下添加(如果之前使用的是http处理程序执行重写的,请写在前面)
<add path="*.html" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/>
以下为IIS7.0配置方式
IIS7不再使用URLRewriter.dll组件了,请使用IIS7的URLWRITER,下载rewrite_2.0_rtw并进行安装,配置
分享到:
相关推荐
ASP.NET2.0内置的urlMappings和基于自定义HTTPModule的URL重写(使用NBear.Web中的UrlRewriteModule实现),并探讨URL重写中可能遇到的陷阱及处理办法。 需要手动为UrlRewriteWebSite目录添加一个到...
通过这个压缩包,开发者可以深入学习如何在IIS环境中配置和使用IIRF,理解URL重写的原理,同时掌握如何在ASP.NET应用中处理POSTBACK问题,进一步提升网站的用户体验和搜索引擎友好性。此外,源码的分析和实践也有助...
总结来说,解决***中URL重写后的页面回传问题,主要通过创建自定义页面基类和重写HtmlTextWriter的方法实现,从而保持URL重写的效果在页面回传操作中依然有效。通过修改Web.config配置,使得所有页面都使用这个...
10. **部署**:了解如何在IIS(Internet Information Services)上配置和部署Asp.Net应用程序是开发过程中的重要环节,涉及到发布设置、URL重写和配置管理等。 在学习Asp.Net的过程中,除了理解这些核心概念,还...
1. ASP.NET概述:了解ASP.NET的历史、版本以及它在.NET生态系统中的位置。 2. 开发环境搭建:学习如何安装Visual Studio,配置ASP.NET开发环境。 3. 第一个ASP.NET应用:创建第一个"Hello, World!"程序,理解页面...
ASP.NET使用视图状态(ViewState)来保持控件状态,即使在PostBack期间也能保留数据。隐藏字段也是存储数据的一种方式,尤其适用于非控件数据。 七、表单验证 ASP.NET提供了一套内置的验证控件,如...
分页是Web应用程序中最常用到的功能之一,在ASP.NET中,虽然自带了一个可以分页的DataGrid(asp.net 1.1)和GridView(asp.net 2.0)控件,但其分页功能并不尽如人意,如可定制性差、无法通过Url实现分页功能等,...
【基于IIS层的IIRF实现URL重写 + 完美解决POSTBACK问题】 1.请在 Windows2003 操作系统环境下测试。 2.请确认您的IIS版本为 IIS6.0+ 。 3.请确认您已经将此项目的ASP.NET网站版本手动设置为 .NET 2.0. 4.请将Bin...
6. **视图状态**:ASP.NET的视图状态机制用于在页面间保存和恢复控件的状态,即使在POSTBACK(回发)过程中也能保持数据。 7. **路由**:在MVC模式中,路由是确定URL与控制器和动作之间关系的机制,允许自定义友好...
6. **页面间通信**:包括查询字符串、URL重写、Session和Application状态,以及如何使用PostBack和Ajax实现异步更新。 7. **MVC框架**:ASP.NET MVC是一个轻量级、模型-视图-控制器架构,我们将会学习其设计模式、...
- **路由与URL重写**:理解ASP.NET路由机制,创建自定义路由规则。 - **安全性**:身份验证(Forms Auth、Windows Auth)、授权、防止XSS和CSRF攻击。 - **部署与性能优化**:IIS配置、发布设置、缓存策略、GZip...
视图状态是一种ASP.NET用来在页面的PostBack过程中保持控件状态的方法。开发者需要了解何时启用或禁用ViewState,以平衡性能和功能需求。 5. **母版页(Master Pages)**: 母版页允许创建一个统一的页面布局,所有...
6. **路由与URL重写**:ASP.NET MVC支持路由机制,允许自定义友好的URL,提高SEO(搜索引擎优化)。在天气预报系统中,可能有类似"/weather/{city}"的路由配置,使得URL更直观。 7. **安全与身份验证**:为了防止未...
3. **ASP.NET核心概念**:生命周期管理、控件事件、视图状态、PostBack机制、路由和URL重写。 4. **ASP.NET Web Forms**:控件体系、数据绑定、用户控件、母版页。 5. **ASP.NET MVC**:模型-视图-控制器架构、路由...
7. **URL重写**:ASP.NET提供URL重写功能,使复杂的服务器端路径可以被友好的、可读的URL所代替,提高用户体验。 8. **ASP.NET Web Forms、MVC和Web API**:虽然标题没有明确指出,但ASP.NET也包含了Web Forms、MVC...
通过上述内容我们可以了解到,**ASP.NET MVC2** 不仅提供了一个更现代化的Web开发框架,还解决了传统ASP.NET Web Forms中的一些不足之处,特别是对于大型、复杂的Web应用来说,其分层设计、灵活的路由机制以及对测试...
此外,可能应用了SEO(搜索引擎优化)策略,如元标签、URL重写等,提高网站在搜索引擎中的可见性。 总结起来,ASP.NET网上书店管理系统结合了ASP.NET的技术优势和SQL Server的数据库管理能力,构建了一个高效、安全...
PostBack 是 ASP.NET 中的一种机制,当用户与页面交互时,页面会自动发送回服务器进行处理。 **5.3 ViewState 的作用** ViewState 用于保存用户界面的状态,以便在页面回发时恢复用户界面的状态。 **5.4 ...
2. **PostBack和Redirect**:在Asp.Net中,PostBack是指用户在同一个页面上操作(如点击按钮)后,页面重新加载的过程。而Redirect则是将用户重定向到新的URL。 3. **页面生命周期**:Asp.Net页面有自己的生命周期...
- CSS样式和JavaScript在ASP.NET中的应用 3. **第三章:Web Forms** - State Management,包括View State、Control State和Session - Postback机制和PageMethods - 用户控件(User Control)和自定义控件...