| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- using System;
- using System.Text.RegularExpressions;
- using System.Web;
- namespace SiteCore.URLRewriter
- {
- public class RewriterModule : IHttpModule
- {
- public void Init(HttpApplication app)
- {
- // WARNING! This does not work with Windows authentication!
- // If you are using Windows authentication, change to app.BeginRequest
- //app.BeginRequest += new EventHandler(app_BeginRequest);
- app.AuthorizeRequest += this.URLRewriter;
- }
- protected void URLRewriter(object sender, EventArgs e)
- {
- HttpApplication app = (HttpApplication)sender;
- string requestedPath = app.Request.Path;
- // get the configuration rules
- UrlsCollection rules = UrlsConfig.GetConfig().Urls;
- for (int i = 0; i < rules.Count; i++)
- {
- // get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)
- string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].VirtualUrl) + "$";
- Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
- if (re.IsMatch(requestedPath))
- {
- string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].DestinationUrl));
- //if (city != "")
- //{
- // if(sendToUrl.IndexOf("?")==-1)sendToUrl = sendToUrl + "?city=" + city;
- // else sendToUrl = sendToUrl + "&city=" + city;
- //}
- RewriterUtils.RewriteUrl(app.Context, sendToUrl);
- break;
- }
- }
- }
- public void Dispose() { }
- }
- /// <summary>
- /// Provides utility helper methods for the rewriting HttpModule and HttpHandler.
- /// </summary>
- /// <remarks>This class is marked as internal, meaning only classes in the same assembly will be
- /// able to access its methods.</remarks>
- internal class RewriterUtils
- {
- #region RewriteUrl
- /// <summary>
- /// Rewrite's a URL using <b>HttpContext.RewriteUrl()</b>.
- /// </summary>
- /// <param name="context">The HttpContext object to rewrite the URL to.</param>
- /// <param name="sendToUrl">The URL to rewrite to.</param>
- internal static void RewriteUrl(HttpContext context, string sendToUrl)
- {
- string x, y;
- RewriteUrl(context, sendToUrl, out x, out y);
- }
- /// <summary>
- /// Rewrite's a URL using <b>HttpContext.RewriteUrl()</b>.
- /// </summary>
- /// <param name="context">The HttpContext object to rewrite the URL to.</param>
- /// <param name="sendToUrl">The URL to rewrite to.</param>
- /// <param name="sendToUrlLessQString">Returns the value of sendToUrl stripped of the querystring.</param>
- /// <param name="filePath">Returns the physical file path to the requested page.</param>
- internal static void RewriteUrl(HttpContext context, string sendToUrl, out string sendToUrlLessQString, out string filePath)
- {
- // see if we need to add any extra querystring information
- if (context.Request.QueryString.Count > 0)
- {
- if (sendToUrl.IndexOf('?') != -1)
- sendToUrl += "&" + context.Request.QueryString;
- else
- sendToUrl += "?" + context.Request.QueryString;
- }
- // first strip the querystring, if any
- string queryString = String.Empty;
- sendToUrlLessQString = sendToUrl;
- if (sendToUrl.IndexOf('?') > 0)
- {
- sendToUrlLessQString = sendToUrl.Substring(0, sendToUrl.IndexOf('?'));
- queryString = sendToUrl.Substring(sendToUrl.IndexOf('?') + 1);
- }
- // grab the file's physical path
- filePath = string.Empty;
- filePath = context.Server.MapPath(sendToUrlLessQString);
- // rewrite the path...
- context.RewritePath(sendToUrlLessQString, String.Empty, queryString);
- }
- #endregion
- /// <summary>
- /// Converts a URL into one that is usable on the requesting client.
- /// </summary>
- /// <remarks>Converts ~ to the requesting application path. Mimics the behavior of the
- /// <b>Control.ResolveUrl()</b> method, which is often used by control developers.</remarks>
- /// <param name="appPath">The application path.</param>
- /// <param name="url">The URL, which might contain ~.</param>
- /// <returns>A resolved URL. If the input parameter <b>url</b> contains ~, it is replaced with the
- /// value of the <b>appPath</b> parameter.</returns>
- internal static string ResolveUrl(string appPath, string url)
- {
- if (url.Length == 0 || url[0] != '~')
- return url; // there is no ~ in the first character position, just return the url
- else
- {
- if (url.Length == 1)
- return appPath; // there is just the ~ in the URL, return the appPath
- if (url[1] == '/' || url[1] == '\\')
- {
- // url looks like ~/ or ~\
- if (appPath.Length > 1)
- return appPath + "/" + url.Substring(2);
- else
- return "/" + url.Substring(2);
- }
- else
- {
- // url looks like ~something
- if (appPath.Length > 1)
- return appPath + "/" + url.Substring(1);
- else
- return appPath + url.Substring(1);
- }
- }
- }
- }
- }
|