urlrewritingnet 域名http状态302 问题(转)
UrlRewritingNet is an Url rewriting tool for ASP .Net and Elmahis a module for logging unhandled errors.
UrlRewritingNet can set a default location for “directory” requests via defaultPage property in <urlrewritingnet> section. When a file without extension is requested the defaultPage value is appended to the original URL.
Elmah provides a handler for getting the errors summary, usually called elmah.axd. This handler also responds to the followings requests:
/elmah.axd/rss – RSS errors list feed
/elmah.axd/digestrss – RSS digest
/elmah.axd/download – comma separated errors list
/elmah.axd/about – about page
/elmah.axd/stylesheet – the stylesheet used
/elmah.axd/detail?id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX – html single error summary
/elmah.axd/xml?id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX – xml single error summary
/elmah.axd/json?id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX – json single error summary
These requests are like a request for a file with no extension. This is why the UrlRewritingNet adds the defaultPage value which leads to the 404 Http response. First sign of this behavior is when the generated html does not contain any CSS style applied.
To fix this situation I simply removed the defaultPage attribute from <urlrewritingnet>.
Now if the default page is not set on IIS, then will get an error when the web site is accessed only by the domain name. This situation was handled by UrlRewritingNet, but in not a proper way, because it returns a 302 Http response(302 Found) with the location set by the defaultPage attribute value, and I think is not the best solution to give the first page when is about SEO. The drawback when the defaultPage attribute is removed is when the directories in the web site are accessed, it will give a 403.14 – Forbidden(IIS 7). But this can be handled by UrlRewritingNet using a custom UrlRewritingProvider.
During developing this custom provider I noticed it would be better to set and the HttpStatus when the url's are rewriten. So I added a new attribute to the <add/> node called httpStatusCode.
Creating a new UrlRewriterNet is very simple:
public class RootProvider : UrlRewritingProvider
{
public override RewriteRule CreateRewriteRule()
{
return new RootRule();
}
}
The class RootRule does all the logic:
public class RootRule : RewriteRule
{
public override void Initialize(UrlRewritingNet.Configuration.RewriteSettings rewriteSettings)
{
base.Initialize(rewriteSettings);
VirtualUrl = rewriteSettings.GetAttribute("virtualUrl", "");
DestinationUrl = rewriteSettings.GetAttribute("destinationUrl", "");
HttpStatusCode = rewriteSettings.GetAttribute("httpStatusCode", "");
}
public override bool IsRewrite(string requestUrl)
{
return requestUrl == VirtualUrl;
}
public override string RewriteUrl(string url)
{
if (!String.IsNullOrEmpty(HttpStatusCode))
{
HttpStatusCodeHandler handler = null;
switch (HttpStatusCode)
{
case "404" :
handler = new _404Handler(DestinationUrl);
break;
case "301":
handler = new _301Handler(DestinationUrl);
break;
case "302":
handler = new _302Handler(DestinationUrl);
break;
default:
handler = new NotImplementedHandler(DestinationUrl);
break;
}
handler.Execute();
return null;
}
return DestinationUrl;
}
public string VirtualUrl { get; set; }
public string DestinationUrl { get; set; }
public string HttpStatusCode { get; set; }
}
The RootRule class instantiates a specific handler, depending by the http status code.
I created a base class to define the model of how a status code could be handled.
public class HttpStatusCodeHandler {
protected string destinationUrl;
protected HttpStatusCodeHandler() { }
public HttpStatusCodeHandler(string DestinationUrl) {
destinationUrl = DestinationUrl;
}
public virtual void Execute() {
throw new NotImplementedHttpStatusException();
}
}
For sample when a directory is accessed it can be used a 404 response.
public sealed class _404Handler : HttpStatusCodeHandler
{
private _404Handler() { }
public _404Handler(string DestinationUrl) : base(DestinationUrl) { }
public override void Execute()
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Status = "404 Not Found";
HttpContext.Current.Response.StatusDescription = "Not Found";
HttpContext.Current.Response.Write(File.ReadAllText(HttpContext.Current.Server.MapPath(destinationUrl)));
HttpContext.Current.Response.End();
}
}
The 302 and 301 reponses needs to add the Location in the header response. The location contains the new URL where the old resource exists now.
public sealed class _302Handler : HttpStatusCodeHandler
{
private _302Handler() { }
public _302Handler(string DestinationUrl) : base(DestinationUrl) { }
public override void Execute()
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Status = "302 Found";
HttpContext.Current.Response.StatusDescription = "Found";
HttpContext.Current.Response.AddHeader("Location", destinationUrl);
HttpContext.Current.Response.End();
}
}
public sealed class _301Handler : HttpStatusCodeHandler
{
private _301Handler() { }
public _301Handler(string DestinationUrl) : base(DestinationUrl) { }
public override void Execute()
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Status = "301 Moved Permanently";
HttpContext.Current.Response.StatusDescription = "Moved Permanently";
HttpContext.Current.Response.AddHeader("Location", destinationUrl);
HttpContext.Current.Response.End();
}
}
public sealed class NotImplementedHandler : HttpStatusCodeHandler
{
private NotImplementedHandler() { }
public NotImplementedHandler(string DestinationUrl) : base(DestinationUrl) { }
public override void Execute()
{
throw new NotImplementedHttpStatusException();
}
}
public class NotImplementedHttpStatusException : Exception
{
public override string Message
{
get
{
return "NotIplementedHttpStatusException";
}
}
}
Now in the RewriteRule section I define some rules:
to define a default page when the folder “products” is accessed
<add name="products" virtualUrl="/products/" destinationUrl="/products/latest_products.asp" httpStatusCode="302"rewriteUrlParameter="ExcludeFromClientQueryString" ignoreCase="true" provider="RootProvider"/>
to say that a page is permanently moved and the new location is other page
<add name="about" virtualUrl="/pages.asp?func=get_content&page_id=1" destinationUrl="/about.asp" httpStatusCode="301"rewriteUrlParameter="IncludeQueryStringForRewrite" ignoreCase="true" provider="RootProvider"/>
These redirects are very helpful when you want to keep the search engines rankings.
原文链接:http://csharpin.blogspot.com/2009/03/using-urlrewritingnet-and-elmah.html
urlrewritingnet 域名http状态302 问题(转)的更多相关文章
- shell+curl监控网站页面(域名访问状态),并利用sedemail发送邮件
应领导要求,对公司几个主要站点的域名访问情况进行监控.下面分享一个监控脚本,并利用sendemail进行邮件发送. 监控脚本如下:下面是写了一个多线程的网站状态检测脚本,直接从文件中读出站点地址,然后 ...
- shell+curl监控网站页面(域名访问状态),并利用sendemail发送邮件
应领导要求,对公司几个主要站点的域名访问情况进行监控.下面分享一个监控脚本,并利用sendemail进行邮件发送. 监控脚本如下:下面是写了一个多线程的网站状态检测脚本,直接从文件中读出站点地址,然后 ...
- Nginx 301重定向域名
为何要使用301重定向 在网站建设中需要网页重定向的情况很多:如网页目录结构变动,网页重命名.网页的扩展名改变.网站域名改变等.如果不做重定向,用户的收藏和搜索引擎数据库中的旧地址只能让访客得到一个4 ...
- 三、nginx301跳转302跳转
301跳转设置: server { listen 80; server_name downcc.com; rewrite ^/(.*) http://www.downcc.com/$1 permane ...
- 什么是HTTP协议?常用的状态码有哪些?
一.HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...
- 未注册wang域名批量查询工具
一.支持规则查询 可自定义生成域名进行查询,可生成任意位数的字母数字域名,根据[声母].[韵母]生成单拼,双拼,三拼等域名,还可根据字典生成,支持全拼.首拼识别,全国城市区号.城市全拼.城市首拼.热门 ...
- 包含为 HTTP 定义的状态代码的值(枚举)
using System; namespace System.Net { // 摘要: // 包含为 HTTP 定义的状态代码的值. public enum HttpStatusCode { // 摘 ...
- php调用whois接口域名查询
由两部分组成,一个index.php文件,一个whois的接口文件: <html> <head> <title>域名到期查询</title> <s ...
- C#HttpWebResponse请求常见的状态码
成员名称 说明 Continue 等效于 HTTP 状态 100.Continue 指示客户端可能继续其请求. SwitchingProtocols 等效于 HTTP 状态 101.Switching ...
随机推荐
- Scala List
1 介绍 Scala中列表List类似于数组,List所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,这意味着一个列表的元素可以不被分配来改变. 第二,列表表示一个链表,而数组平 ...
- Heritrix源码分析(二) 配置文件order.xml介绍(转)
本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/613412 本博客已迁移到本人独立博客: http://www.yun5u. ...
- activity_main.xml与fragment_main.xml
见: http://blog.sina.com.cn/s/blog_3e28c8a50101fqvw.html http://blog.sina.com.cn/s/blog_3e28c8a50101f ...
- Informatica9.6.1在Linux Red Hat 5.8上安装遇到的有关问题整理_1
1. 产品安装过程中提示无法创建Domain([ICMD_10033] Command [defineDomain] failed with error [[INFASETUP_10002]) 1) ...
- nginx服务器防sql注入/溢出攻击/spam及禁User-agents
本文章给大家介绍一个nginx服务器防sql注入/溢出攻击/spam及禁User-agents实例代码,有需要了解的朋友可进入参考. 在配置文件添加如下字段即可 代码如下 复制代码 server { ...
- AngularJS自定义指令(Directives)在IE8下的一个坑
在项目中,由于要兼容到IE8,我使用1.2.8版本的angularJS.这个版本是支持自定义指令的.我打算使用自定义指令将顶部的header从其他页面分离.也就是实现在需要header的页面只用在&l ...
- [转]Linux之type命令
转自:http://codingstandards.iteye.com/blog/831504 用途说明 type命令用来显示指定命令的类型.一个命令的类型可以是如下之一 alias 别名 keywo ...
- 北邮网关登录python脚本
闲来无聊,来码一发 安装 pip install byrlogin 登录 登出
- CString类Format()的用法 .xml
pre{ line-height:1; color:#9f1d66; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#5d57ff; ...
- [翻译]Python——十年语言之冠
最近我发现了这个PYPL——编程语言流行指数.它对各种语言的流行指标进行了二次发掘.作者指出TIOBE指数很可能不能反映出真实情况,归咎于一些编程语言的名称会导致误解.他引入了一些新术语,利用谷歌趋势 ...