ASP.NET中的URLRewrite

 一、URL Rewrite

URL Rewrite是截取传入Web 请求并自动将请求重定向到其他URL的过程。

比如浏览器发来请求hostname/101.aspx ,服务器自动将这个请求中定向为http://hostname/list.aspx?id=101

URL Rewrite的优点在于:

1. 缩短URL,隐藏实际路径提高安全性
2. 易于用户记忆和键入
3. 易于被搜索引擎收录

有很多种手段实现URL Rewrite,我选择了我认为最好的一种。这种方法的优点在于,不需要更改任何与IIS有关的设定,而且在中等信任安全等级的虚拟主机中,也可以使用。

二、实现细节

1. 准备URLRewrite.NET的类库,将网站引用这个类库;

2. 将configSections加入到configuration的第一节:

<configSections>
<section name="rewriter"
requirePermission="false"
type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
</configSections>

3. 将对httpModule的处理加入到system.web中:

<httpModules>
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />
</httpModules>

4. 在configuration中,加入对rewrite的设定:

<rewriter>
<rewrite url="~/Articles/(\d+)" to="~/Articles/Detail.aspx?id=$1" />
<rewrite url="~/Categories/(\d+)" to="~/Articles/List.aspx?id=$1" />
<rewrite url="~/Categories/(\d+)_(\d+)" to="~/Articles/List.aspx?id=$1&amp;page=$2" />
</rewriter>

需要注意的是,当使用多个参数时,需要使用HTML转义字符来代替&符号。

三、IIS配置

在IIS 7中,URLRewriter.NET可以不经配置正常使用,但是在IIS 6中,需要进行一些配置,详见以下链接。

http://urlrewriter.net/index.php/support/installation/windows-server-2003

四、ASP.NET的Postback设定

由于在使用了UrlRewriter后,ASP.NET中的Postback机制导致页面发生回送后,会在浏览器中使用其原始链接,容易使用户发生困惑,也不利于搜索引擎的检索,故需要加以处理。

在ASP.NET 2.0后,我们可以通过使用控件适配器的扩展框架来定制重写<form>的action属性,而不需要对页面代码做出任何改动。

1. 在App_Code中,加入FormRewriter.cs文件:

using System.Web;
using System.Web.UI;

 

public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
{
protected override void Render(HtmlTextWriter writer)
{
base.Render(new RewriteFormHtmlTextWriter(writer));
}
}

public class RewriteFormHtmlTextWriter : HtmlTextWriter
{
public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
: base(writer)
{
InnerWriter = writer.InnerWriter;
}

public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
: base(writer)
{
InnerWriter = writer;
}

public override void WriteAttribute(string name, string value, bool fEncode)
{
if ((name == "action"))
{
HttpContext Context = HttpContext.Current;
if (Context.Items["ActionAlreadyWritten"] == null)
{
value = Context.Request.RawUrl;
Context.Items["ActionAlreadyWritten"] = true;
}
}
base.WriteAttribute(name, value, fEncode);
}
}

2. 在App_Browsers中,加入Form.browser文件:

<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="FormRewriterControlAdapter" />
</controlAdapters>
</browser>
</browsers>

这样处理后,就可以保证页面在发生Postback后,仍然使用原来的URL作为链接。

转自:http://kb.vigal.net/asp-net-url-rewrite/ 

转载于:https://www.cnblogs.com/lidaohang/archive/2010/07/19/1780499.html

出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.youkuaiyun.com/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值