I moved my blog today over to BlogEngine .Net today. It is a nice blog engine that stores the blog entries in xml. You can also publish blog entries with windows live writer or Word 2007.
To keep my existing links working I added to the rewriter class in the BlogEngine.Core. I created an xml file which stores the OldUrl and the NewUrl to rewrite to. I store the urls I am rewriting in an xml (rewrite.xml) file in the App_Data directory
In the UrlRewrite class I changed the context_BeginRequest procedure to this.
private void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
DataSet ds = new DataSet();
int intStart = context.Request.RawUrl.IndexOf('/', 8) + 1;
string UrlPart = context.Request.RawUrl.Substring(intStart);
ds.ReadXml(context.Server.MapPath(@"~/App_Data/rewrite.xml"));
DataRow[] dr = ds.Tables["Urls"].Select("OldUrl Like '" + UrlPart + "'", null);
if (dr.Length > 0)
{
string s = dr[0]["NewUrl"].ToString();
if (s.Contains(@"/"))
{
// if rewrite path is not in same directory we have to redirect
context.Response.Redirect(s);
}
else
{
// we can use repath if in same directory
context.RewritePath(s);
}
return;
}
if (context.Request.RawUrl.ToLowerInvariant().Contains(".aspx"))
{
if (context.Request.RawUrl.ToLowerInvariant().Contains("/post/"))
{
RewritePost(context);
}
else if (context.Request.RawUrl.ToLowerInvariant().Contains("/category/"))
{
RewriteCategory(context);
}
else if (context.Request.RawUrl.ToLowerInvariant().Contains("/page/"))
{
RewritePage(context);
}
else if (context.Request.RawUrl.ToLowerInvariant().Contains("/author/"))
{
string author = ExtractTitle(context, "/author/");
context.RewritePath("~/default.aspx?name=" + author + GetQueryString(context), false);
}
//else if (context.Request.RawUrl.ToLowerInvariant().Contains("/tag.aspx/"))
//{
// string tag = ExtractTitle(context, "/tag.aspx/");
// context.RewritePath("~/default.aspx?name=" + tag + GetQueryString(context), false);
//}
}
}
The XML file Rewriter.xml in the App_Data directory to store the Urls to rewrite
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<Urls>
<OldUrl>sitemap.aspx</OldUrl>
<NewUrl>sitemap.axd</NewUrl>
</Urls>
</DocumentElement>
I also added a webpage rewrite.aspx in the admin/pages directory for editing the Urls
<%@ Page Language="C#" MasterPageFile="~/admin/admin1.master" AutoEventWireup="true" CodeFile="Rewrite.aspx.cs" Inherits="admin_Pages_Rewrite" Title="URL Rewrites" %>
<asp:Content ID="Content1" ContentPlaceHolderID="cphAdmin" Runat="Server">
<asp:Label runat="server" ID="lblOld" Text="Old Url" ></asp:Label><asp:TextBox runat="Server" ID="txtOld"></asp:TextBox><br />
<asp:Label ID="Label1" runat="server" Text="New Url" ></asp:Label><asp:TextBox runat="Server" ID="txtNew"></asp:TextBox><br />
<br />
<asp:Button ID="btnAdd" runat="server" OnClick="btnAdd_Click" Text="Add" /><br />
<asp:GridView runat="server" ID="gridRewrite" AutoGenerateColumns="false" UseAccessibleHeader="true" Width="100%" HeaderStyle-HorizontalAlign="left">
<Columns>
<asp:BoundField DataField="OldUrl" HeaderText="<%$ Resources:labels, OldUrl %>" />
<asp:BoundField DataField="NewUrl" HeaderText="<%$ Resources:labels, NewUrl %>" />
<asp:TemplateField HeaderText="<%$ Resources:labels, delete %>">
<ItemTemplate>
<a href="?delete=<%# Eval("OldUrl") %>" onclick="return confirm('<%# string.Format(Resources.labels.areYouSure, Resources.labels.delete.ToLower(), Eval("OldUrl")) %>')"><%=Resources.labels.delete %></a>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</asp:Content>
The code behind
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class admin_Pages_Rewrite : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = new DataSet();
string strPath = Server.MapPath("~/App_Data/rewrite.xml");
ds.ReadXml(strPath);
if (!Page.IsPostBack)
{
if (Request.QueryString["delete"] != null)
{
DataRow[] dr = ds.Tables["Urls"].Select("OldUrl ='" + Request.QueryString["delete"].ToString() + "'", null);
try
{
ds.Tables["Urls"].Rows.Remove(dr[0]);
}
catch (Exception)
{
System.Diagnostics.Debug.Print("Not found");
}
ds.WriteXml(strPath);
}
}
gridRewrite.DataSource = ds.Tables["Urls"];
gridRewrite.DataBind();
}
protected void btnAdd_Click(object sender, EventArgs e)
{
string strPath = Server.MapPath("~/App_Data/rewrite.xml");
DataSet ds = new DataSet();
ds.ReadXml(strPath);
DataRow dr = ds.Tables["Urls"].NewRow();
dr["OldUrl"] = txtOld.Text;
dr["NewUrl"] = txtNew.Text;
ds.Tables["Urls"].Rows.Add(dr);
ds.WriteXml(strPath);
Response.Redirect("rewrite.aspx", true);
}
}