精华内容
下载资源
问答
  • URL重写

    2012-02-20 11:12:49
    URL重写
  • URl重写

    2019-06-27 10:34:16
    一 什么是url重写 URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。比如浏览器发来请求 hostname/101.aspx ,服务器自动将这个请求中定向为http://hostname/list.aspx ?id=101。 url重写的优点...
    一 什么是url重写
    URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。比如浏览器发来请求 hostname/101.aspx ,服务器自动将这个请求中定向为http://hostname/list.aspx ?id=101。
    url重写的优点在于:
    l    缩短url,隐藏实际路径提高安全性
    l    易于用户记忆和键入。
    l    易于被搜索引擎收录

    二 实现url重写的基本方法
    1.    下载ms的URLRewriter.dll,放到你的web程序的bin下
    下载地址1:http://www.sinoec.cn/fordown/URLRewriter.dll
    下载地址2:
    download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi

    下载完成后,在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>

    其中
    <section name="RewriterConfig"
    type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
    </configSections>
    用于指定配置节"RewriterConfig"的处理程序类的名称为”URLRewriter.Config.RewriterConfigSerializerSectionHandler”,该类存在于bin目录下的URLRewriter .dll文件中

    配置节"RewriterConfig"内容如下
    <RewriterConfig>
    <Rules>
    <RewriterRule>
    <LookFor>~/d(\d+)\.aspx</LookFor>
    <SendTo>~/default.aspx?id=$1</SendTo>
    </RewriterRule>
    </Rules>
    </RewriterConfig>

    其中关键的是这两句
    <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。这样就起到了隐藏真实文件名,并便于用户记忆的作用。


    2.处理回发
    在重写后的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>

    (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

    这样就解决回发问题。
    全文完

    转载于:https://www.cnblogs.com/relang99/archive/2007/03/22/684433.html

    展开全文
  • URL 重写

    2020-12-28 20:20:47
    1. URL重写的目的。下边描述的比较好,但好像这对于java后台基于spring开发不是问题,controller中可以轻易实现读取URL 中的path variable。 Changing a URL to the required format. URL rewriting allows URLs to...

    1. URL重写的目的。下边描述的比较好,但好像这对于java后台基于spring开发不是问题,controller中可以轻易实现读取URL 中的path variable。

    Changing a URL to the required format. URL rewriting allows URLs to be more easily remembered by the user. When the URL is entered into the Web server, the URL rewrite engine modifies the syntax behind the scenes to enable the appropriate Web page or database item to be retrieved. For example, to look up the definition for "path," a user friendly URL might look like computerlanguage.com/path. The rewrite engine could turn it into the following syntax: computerlanguage.com/results.php?definition=path. See URL.
     

    另外URL重写还有以下应用:

    1). 针对浏览器端禁用cookie的情况,可以将session信息写入下一个访问的URL中。比如如下文档介绍的:

    https://blog.csdn.net/qq_42857603/article/details/82897870

    2). 据说还可以方便搜索殷勤搜索,不太清楚其中原理。

    2. URL重写实现方式。

    1) . 在http server中配置

    https://www.cnblogs.com/zhenghongxin/p/6798310.html

    2). 通过tomcat配置。

    https://www.cnblogs.com/ttjava/p/3641014.html

    3). 当然还可以在java 后台程序中重写响应给客户端的html页面里边包含的超级链接URL。但这跟上边两种情况,在收到第一个HTTP 请求就将请求对象的URL重写,然后交给后台程序处理(比如servlet 或者controller)还不是一个层面的意思。上边说的将session写入下一个访问的URL中,实际上就是利用这个所谓的重写机制来实现。感觉这一点也叫URL重写,有点勉强。

     

    展开全文
  • URL重写URL重写URL重写URL重写URL重写URL重写
  • url重写

    千次阅读 2018-05-16 08:39:55
    为了页面更有利于seo优化,url重写程序需要做出的不可缺少的手段之一。二.目前url重写最常见的两种方法有: 1.通过熟悉页面的内部执行流程,也就是asp.net请求管道中的相关知识点,进行url重写。 2.通过使用微软...

    http://www.cnblogs.com/knowledgesea/archive/2012/10/08/2715350.html

     一. 为了页面更有利于seo优化,url重写程序需要做出的不可缺少的手段之一。

    二.目前url重写最常见的两种方法有:

             1.通过熟悉页面的内部执行流程,也就是asp.net请求管道中的相关知识点,进行url重写。

             2.通过使用微软提供的UrlRewriter.dll实现url重写(简单);

    三、在请求管道中的第一个请求管道中拦截url并使其完成url重写功能:

             1.熟悉请求管道实现程序运行的全过程:

    (1):BeginRequest: 开始处理请求
    (2):AuthenticateRequest授权验证请求,获取用户授权信息
    (3):PostAuthenticateRequest获取成功
    (4): AunthorizeRequest 授权,一般来检查用户是否获得权限
    (5):PostAuthorizeRequest:获得授权
    (6):ResolveRequestCache:获取页面缓存结果
    (7):PostResolveRequestCache 已获取缓存
    (8):PostMapRequestHandler 创建页面对象
    (9):AcquireRequestState 获取Session-----先判断当前页面对象是否实现了IRequiresSessionState接口,如果实现了,则从浏览器发来的请求报文体中获得SessionID,并到服务器的Session池中获得对应的Session对象,最后赋值给HttpContext的Session属性
    (10)PostAcquireRequestState 获得Session
    (11)PreRequestHandlerExecute:准备执行页面对象
    执行页面对象的ProcessRequest方法
    (12)PostRequestHandlerExecute 执行完页面对象了
    (13)ReleaseRequestState 释放请求状态
    (14)PostReleaseRequestState 已释放请求状态
    (15)UpdateRequestCache 更新缓存
    (16)PostUpdateRequestCache 已更新缓存
    (17)LogRequest 日志记录
    (18)PostLogRequest 已完成日志
    (19)EndRequest 完成、

             2.直接上代码:



    网站结构图:



    复制代码

    using
    System; using System.Collections.Generic; using System.Web; using System.Text; using System.Text.RegularExpressions; namespace UrlReWriter { class UrlWriter:IHttpModule { #region IHttpModule 成员 public void Init(HttpApplication context) { context.BeginRequest+=new EventHandler(context_BeginRequest); } void context_BeginRequest(object sender, EventArgs e) { //获得当前页面请求管道的HttpApplication对象 HttpApplication application = sender as HttpApplication; HttpContext context = application.Context;//获得上下文对象 string url = context.Request.Url.LocalPath;//获得URL(不包含域名和路径) Regex reg1 = new Regex("/WebForm2/[A-Z0-9a-z_]+");//注意文件夹与文件名称的大小写. if (reg1.IsMatch(url)) //这种情况是匹配根据ID值来查看某个文章的内容。 { string strUserName = url.Substring(url.LastIndexOf('/')+1); context.RewritePath("/WebForm2.aspx?id=" + strUserName); //前台的列表页就可以这样写:<a href='../WebForm2/<%#Eval("id")%>'></a> } else if (url.Contains("/admin")) //如果url中包含"/admin"字样则转向,实现用户验证,哈哈,不过这里是错的,应为这个请求管道中还获取不到session值呢,这个验证最好在第九个请求管道(AcquireRequestState )中完成。 { context.RewritePath("/Error.aspx"); } } public void Dispose() { } #endregion } }
    复制代码


    复制代码
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="url重写.WebForm1" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
           <a href="WebForm2/12">重写</a>   <!--这里是有利于seo的链接-->
        </div>
        </form>
    </body>
    </html>
    复制代码


    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace url重写
    {
        public partial class WebForm2 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                Response.Write(Request.QueryString["id"]);           //在转到的页面输出传过来的参数
            }
        }
    }
    复制代码


      <httpModules>
          <add name="UrlReWriter" type="UrlReWriter.UrlWriter,UrlReWriter"/>
        </httpModules>
        <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
      </system.web>


    note:记得在url重写项目中引用UrlReWriter项目。否则httpModules接口没有注册,url重写泡汤是必然的。呵呵



    四、第二种重写方式,是微软提供的bll,很容易实现的,大家可以在网上查一下资料,很简单的我就不写了,如果不会也可以跟我留言,咱们再一起沟通的。。呵呵,886。。。


    先添加引用URLRewriter.dll到项目下的bin目录中,微软下载包/Files/Jaylong/MSDNURLRewriting.zip

    1.在web.config文件中  <configuration>节点的<configSections>下面的配置节点

    <!--配置重写规则节点-->
        <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />

    2.在 <configuration>节点范围类编写重写规则

     <!--重写规则-->
      <RewriterConfig>
      <Rules>
       <RewriterRule>
        <LookFor>~/web/new/(.[0-9]*)\.aspx</LookFor>
            <SendTo>~/web/new.aspx?id=$1</SendTo>
       </RewriterRule>
         <RewriterRule>
            <LookFor>~/index.html</LookFor>
            <SendTo>~/default.aspx</SendTo>
          </RewriterRule>
          <RewriterRule>
            <LookFor>~/show_([0-9]*).html</LookFor>
            <SendTo>~/show.aspx?id=$1</SendTo>
          </RewriterRule>
        </Rules>
     </RewriterConfig>

    3.在 <system.web>节点中的 <httpHandlers>下面配置

      <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
      <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" /><!--不加此节点不能定向html页面-->

     4.在浏览器中输入 index.html,实际访问的是default.aspx页面

        访问show_2.html实际是访问show.aspx?id=2的页面

    所有源码下载:/Files/Jaylong/WebSite1.zip

    展开全文
  • URL重写URL重写URL重写

    2010-03-08 16:27:21
    URL重写URL重写URL重写URL重写URL重写URL重写
  • URL重写URL重写

    2010-04-30 18:09:04
    URL重写URL重写URL重写URL重写URL重写URL重写

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,345
精华内容 5,338
关键字:

url重写