How to return 301/200 for selective 404 HTTP status or in other words say URL-rewriting
About a month ago, I came across an interesting request from my customer, who wanted to have render 301/200 for specific 404 pages. May be few of us are aware about URL re-writing & designing of HTTP modules; but interesting point to share here difference between 2 methods to achieve this
Issue Description:
- Customer had a collection of URLs , which when we type in browser, it gives HTTP 404 Not found. The reason they are short handed URL and not the the complete URL
- Example:
- https://anjalich11:5000/TI is the URL which actually needs to be redirected to : https://anjalich11:5000/TI/Pages/default.aspx
- Because of HTTP 404, Customer had issues with external sites which crawl these links. The crawler won’t crawl these links as it is rendered as HTTP 404
- We want these links to be rendered as HTTP 301 “Temporarily Moved” OR mark as HTTP 301 “Successful” which will help the crawler to crawl the links
Tool Used:
- The tool I used to view the HTTP requests is Fiddler. You can get it at www.fiddlertool.com
Points to NOTE :
Before we discuss about the solutions, there are few questions here: (Note: Read the 2 Scenarios and their respective fiddler test result for both the Scenarios.)
Scenario 1:
- What if we want the link to be crawled?
- What if we want the URL to be rendered as HTTP 200 (Success) instead of 404 (Page Not Found)
- What if we want the URL to render contents of other link but for User it seems to the same link.
- Example:
- User enters: https://anjalich11:4000/TI
- But the page to be processed at HTTP handler need to be changed before processing.
- Say need to render data from this page: https://anjalich11:4000/TI/Pages/default.aspx
Scenario 2:
- What if we want the link to be marked as Temporarily Moved?
- What if we want the URL to be rendered as HTTP 301 (Temporarily Moved) instead of 404 (Page Not Found)
- What the redirection need to be mentioned dynamically rather than mentioning at IIS settings
Resolution / WorkAround
For Scenario 1: Taking Example to explain the resolution
- User enters link: https://anjalich11:4000/TI
- Data Rendered for the requested link is :https://anjalich11:4000/TI/Pages/default.aspx
- User still sees the entered URL & he wont know that URL is been rendered/processed from some other page
Resolution For Scenario 1:
We need to create custom HTTPModule inheriting from IHttpModule for achieving URL Rewriting
Note: We need to define 2 methods: Dispose() & Init()Depending upon the Authentication for SharePoint Site, we need to decide as which event need to be used for URL Rewriting
- If you use Windows authentication with file authorization, we will need to change this so that URL rewriting is performed in either the BeginRequest or AuthenticateRequest events
- Else we can do URL rewriting in Authorize event
I will be selecting for Begin Event.
Create an Event Handler for Begin event and register the event in the Initialize event
Writing Code for URL Rewriting:
Complete Code Snippet:
namespace HTTPModule404To301 {
public class HTTPModule404To301 : IHttpModule {public void Dispose() {}
public void Init(HttpApplication context) {
context.BeginRequest += new EventHandler(URLRewriter_BeginRequest);
}void URLRewriter_BeginRequest(object sender, EventArgs e) {
HttpApplication app = (HttpApplication)sender;
Rewrite(app.Request.Path, app);
}protected void Rewrite(string requestedPath,System.Web.HttpApplication app){
Boolean blnRedirect ;// Business Logic to connect to data repository and thereby check if the shortcut for the link exists and get the link which need to be rendered
if (blnRedirect)
{
// Here, as per our example mentioned above: strUrlToBeRendered= "/TI/Pages/default.aspx"
// Note: It takes Relative URL Path.
HttpContext.Current.RewritePath(strUrlToBeRendered, String.Empty, String.Empty);
}
}
}
}Test Result on FIDDLER TOOL
- When we enter https://anjalich11:4000/TI when there is no custom HTTP Module designed; we can see Value HTTP 404
- After we designed custom HTTP Module, for URL: https://anjalich11:4000/TI, we can see Value HTTP 200
For Scenario 2: Taking Example to explain the resolution
- User enters link: https://anjalich11:4000/TI
- We need to render to Browser as HTTP 301 "Temporarily Moved" and thereby redirect to other URL Page showing Custom Message/the content
Note: Make sure the redirected page exists
Resolution For Scenario 2:
We need to create custom HTTPModule inheriting from IHttpModule for achieving URL Rewriting
Note: We need to define 2 methods: Dispose() & Init()Depending upon the Authentication for SharePoint Site, we need to decide as which event need to be used for URL Rewriting
- If you use Windows authentication with file authorization, we will need to change this so that URL rewriting is performed in either the BeginRequest or AuthenticateRequest events
- Else we can do URL rewriting in Authorize event
I will be selecting for Begin Event.
Create an Event Handler for Begin event and register the event in the Initialize event
Writing Code for URL Rewriting:
Complete Code Snippet:
namespace HTTPModule404To301 {
public class HTTPModule404To301 : IHttpModule {public void Dispose() {}
public void Init(HttpApplication context) {
context.BeginRequest += new EventHandler(URLRewriter_BeginRequest);
}void URLRewriter_BeginRequest(object sender, EventArgs e) {
HttpApplication app = (HttpApplication)sender;
Rewrite(app.Request.Path, app);
}protected void Rewrite(string requestedPath,System.Web.HttpApplication app){
Boolean blnRedirect ;// Business Logic to connect to data repository and thereby check if the shortcut for the link exists and get the link which need to be rendered
if (blnRedirect)
{
//Adding Response header
app.Response.StatusCode =301;
app.Response.RedirectLocation= strRedirectLocation;
app.Response.Flush();
app.Response.End();
}
}
}
}Test Result on FIDDLER TOOL
- When we enter https://anjalich11:4000/TI when there is no custom HTTP Module designed; we can see Value HTTP 404
- After we designed custom HTTP Module, for URL: https://anjalich11:4000/TI, we can see Value HTTP 301 and then there will be another entry for the redirected Page with HTTP Status 200