ASP.NET URL伪静态重写实现方法
ASP.NET URL伪静态重写实现方法
首先说下,ASP.NET URL伪静态只是将~/a_1.html指向到了~/a.aspx?ID=1,但a.aspx还是真实存在的,你不用./a_1.html来访问,用./aaa.aspx?ID=1也是可以访问的,伪静态并会真的把你的a.aspx变为a.html
在web.config里设置如下:
- <?xml version="1.0" encoding="utf-8" ?>
- <!--overred-->
- <configuration>
- <configSections>
- <section name="RewriterConfig"type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
- </configSections>
- <RewriterConfig>
- <Rules>
- <RewriterRule>
- <LookFor>~/d(\d+)\.aspx</LookFor>
- <SendTo>~/default.aspx?id=$1</SendTo>
- </RewriterRule>
- </Rules>
- </RewriterConfig>
- <system.web>
- <httpHandlers>
- <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
- </httpHandlers>
- </system.web>
- </configuration>
其中
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
用于指定配置节"RewriterConfig"的处理程序类的名称为”URLRewriter.Config.RewriterConfigSerializerSectionHandler”,该类存在于bin目录下的URLRewriter .dll文件中
关键的是这两句
<LookFor>~/d(\d+)\.aspx</LookFor>
<SendTo>~/default.aspx?id=$1</SendTo>
<LookFor>~/d(\d+)\.aspx</LookFor>
表示,用户输入的url,d(\d+)\.aspx是 url中文件名匹配的正则表达式(此处为字母d开头,后面跟一个或多个数字,并以.aspx结尾。用户也可根据自己的需要自行设定)。
<SendTo>~/default.aspx?id=$1</SendTo>
,表示当服务器接收到符合上面条件的请求后如何重 写url。此处表示访问defalutl.aspx并传入参数id,其值$1将用用户请求的文件名中的第一个数字来表示。
例如用户输入 hostname/d11.aspx, 服务器会把他重写为http://hostname/default.aspx?id=11。换句话说用户输入http: //hostname/d11.aspx,实际访问的是http://hostname/default.aspx?id=11。这样就起到了隐藏真实文件名,并便于用户记忆的作用。
处理回发
在重写后的url里如果产生回发,例如有一个按钮,又调用了该被重写的aspx,用户浏览器中将会显示该aspx文件实际的地址,也就是http: //hostname/default.aspx?id=11。但从用户的角度考虑,如 果单击按钮时突然看到 URL 更改会使他们感到不安。因此必须解决这个问题。
解决方法有二:
(1)自己定义一个Actionlessform类,在aspx中不再使用系统提供的form 标记
- namespace ActionlessForm
- {
- public class Form : System.Web.UI.HtmlControls.HtmlForm
- {
- protected override void RenderAttributes(HtmlTextWriter writer)
- {
- writer.WriteAttribute("name", this.Name);
- base.Attributes.Remove("name");
- writer.WriteAttribute("method", this.Method);
- base.Attributes.Remove("method");
- this.Attributes.Render(writer);
- base.Attributes.Remove("action");
- if (base.ID != null)
- writer.WriteAttribute("id", base.ClientID);
- }
- }
- }
创建此类并对其进行编译之后,要在 ASP.NET Web 应用程序中使用它,应首先将其添加到 Web 应用程序的 References 文件夹中。然后,要使用它来代替 HtmlForm 类,做法是在 ASP.NET 网页的顶部加上以下内容:
<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>
然后,将 <form runat="server">(如果有)替换为:<skm:Form id="Form1" method="post" runat="server">
并将右边的 </form> 标记替换为:</skm:Form>
/******************************************/
以上的方法:页面会出现创建控制项发生错误情况,接下来介绍不用以上的方法
将页面的<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>删除,将 :<skm:Form id="Form1" method="post" runat="server">
(如果有)替换为<form runat="server">并将右边的 </skm:form> 标记替换为:</Form>
然后执行下面的做法
(2)以上的是继承个form,第二种方法就是继承page,这样你不需要在aspx页中改任何东西。
- using System;
- using System.IO;
- using System.Web;
- using System.Web.UI;
- namespace URL
- {
- public class OLPage : Page
- {
- public OLPage()
- {}
- protected override void Render(HtmlTextWriter writer)
- {
- if (writer is System.Web.UI.Html32TextWriter)
- {
- writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
- }
- else
- {
- writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
- }
- base.Render(writer);
- }}
- internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
- {
- private string _url; // 假的URL
- internal FormFixerHtml32TextWriter(TextWriter writer):base(writer)
- {
- _url = HttpContext.Current.Request.RawUrl;
- }
- public override void WriteAttribute(string name, string value, bool encode)
- {
- if (_url != null && string.Compare(name, "action", true) == 0)
- {
- value = _url;
- }
- base.WriteAttribute(name, value, encode);
- }
- }
- internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
- {
- private string _url;
- internal FormFixerHtmlTextWriter(TextWriter writer):base(writer)
- {
- _url = HttpContext.Current.Request.RawUrl;
- }
- public override void WriteAttribute(string name, string value, bool encode)
- {
- if (_url != null && string.Compare(name, "action", true) == 0)
- {
- value = _url;
- }
- base.WriteAttribute(name, value, encode);
- }}}
把这个文件编译成dll,并在你的项目中引用它。
然后把项目中的所有aspx文件对应的cs文件中的继承page类的代码改写为继承OLPage。
例如
public class WebForm1:page
改写为
public class WebForm1:URL.OLPage
这样就解决回发问题。
(3)通过客户端代码清除form的action。
对于ASPX页面,我们在客户端查看代码时会发现,它自动为form加入了action,并且地址就是开始所说的原始页面地址。而对于ASPX页面,若当它的action为空时也就将回发到当前地址。这样我们就可以通过在客户端清除action的方法,来实现回发后继续保持有地址。
在页面中加入以下代码即可:
<script type="text/javascript">try{document.forms[0].action=""}catch(ex){}</script>
这种伪静态重写方法不用改动原来的代码,应该是最简单易用的了。
ASP.NET URL伪静态重写实现方法的更多相关文章
- UrlRewritingNet伪静态的使用方法与解决方案(URL重写)
在建站初期时,我们往往需要考虑的是使用真静态还是伪静态,这对于往后的站点配置,延展性都会产生深远的影响. 我使用伪静态的唯一目的:SEO优化.毋容置疑,伪静态在对于Spider是非常有利的,因此,我更 ...
- ASP.NET 实现伪静态网页方法
方法一:利用Httphandler实现URL重写(伪URL及伪静态) 我们有时候会见到这样的地址:“http://www.huoho.com/show-12-34.html”,你或许认为在站点服务器根 ...
- ThinkPHP - URL - 伪静态 - 路由 - 重写
URL: 一.URL规则 1.默认是区分大小写,可以修改(配置文件)为不区分大小写. 2. //修改URL大小写问题 'URL_CASE_INSENSITIVE' =>true, 如果模块名为 ...
- asp.net url重写相关技术问题整理
1.IIS7配置URL重写需要注意系统是32位还是64位的 在IIS7配置URL重写的时候,需要添加“脚本映射”,如果是64位系统,会有两个地方存放.net framework分别是32位系统和64位 ...
- 开启URL伪静态的方法
## 开启URL伪静态的方法.txt# 1. 请确认您服务器的类型. ThinkSNS的伪静态规则支持Apache.IIS.Nginx. 2. 请确认您的服务器支持URL Rewrite(可从服务器提 ...
- thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成(十五)
原文:thinkphp URL规则.URL伪静态.URL路由.URL重写.URL生成(十五) 本章节:详细介绍thinkphp URL规则.URL伪静态.URL路由.URL重写.URL生成 一.URL ...
- ThinkPHP URL伪静态、路由规则、重写、生成
一.URL规则 1.默认是区分大小写的 2.如果我们不想区分大小写可以改配置文件 'URL_CASE_INSENSITIVE'=>true,//url不区分大小写 ...
- 修改ZuulHandlerMapping私有变量pathMatcher,重写match方法,使url匹配兼容正则表达式。
一.起源 在mocksever中引入了spring cloud zuul做代理转发,如果请求的url和配置的mock规则匹配(精确匹配和模糊匹配),忽略,不做转发.如果mock配置的url和请求url ...
- 三种实现PHP伪静态页面的方法(转)
PHP伪静态写法--其一 伪静态又名:URL重写 以下列举了三种方法. 方法一: 比如这个网页 http://www.2cto.com /soft.php/1,100,8630.html 其实处理的脚 ...
随机推荐
- 我的HTML笔记
HTML(Hypertext Marked Language)"超文本标记语言". 1.HTML的声明 <!DOCTYPE html> 2.HTML的基本结构 < ...
- Scala underscore的用途
_ 的用途 // import all import scala.io._ // import all, but hide Codec import scala.io.{Codec => _, ...
- VS 2013 Preview 自定义 SharePoint 2013 列表 之 两个Bug
SharePoint 2013 已RTM了,对于程序员来说又要了解新功能了,同时 VS 2013 也将要 RTM了,两者同时应用定会有不新功能,我们先从 自定义 列表开始. SharePoint 20 ...
- [Angularjs]视图和路由(四)
写在前面 关于angularjs的路由的概念基本上这篇就要结束了,通过学习,以及在实际项目中的实践,还是比较容易上手的.自己也通过angularjs做了一个在app上的一个模块,效果还是可以的. 系列 ...
- [原创]winform_PC宴会图片抽奖/文字抽奖
14年6月 好友结婚 14年4月左右知道他们婚礼由迎宾照抽奖的环节 问我有没有可以用的抽奖软件 我网上找了一会儿,就放弃了,自己做一个更快不是? 14年6月,PC宴会图片抽奖软件成功使用 --- 操作 ...
- sqlserver 存储过程 try catch TRANSACTION (转)
CREATE PROCEDURE YourProcedure ASBEGIN SET NOCOUNT ON; BEGIN TRY---------------------开始捕捉异常 ...
- c++类的定义《一》
最近好忙,一来要在店里看店,二来朋友办结婚酒,搞的我这几天好疲惫啊···博客又有好几天没提笔了. 下午简单看了下书,看到了类的部分,自己动手练习了一下 笔记:1.类是数据类型 / 它的变童就是对象 ...
- 卸载WIN10自带功能
要卸载OneNote,在里面输入 Get-AppxPackage *OneNote* | Remove-AppxPackage 可以复制,回车执行 4 要卸载3D,输入 Get-AppxPackage ...
- SharePoint 2013 列表多表联合查询
在SharePoint的企业应用中,遇到复杂的逻辑的时候,我们会需要多表查询:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,需要使用SPQuery的Joins ...
- SharePoint 2013 内容部署功能简介
在之前的项目中,当客户有新的需求的时候,我们通常在测试环境上开发或者实施,然后手动在生产环境再弄一次.当发现内容部署这个东西,才知道这样是多么不合理的.我们可以创建两个网站集,一个用来修改,然后通过计 ...