85 lines
2.7 KiB
C#
85 lines
2.7 KiB
C#
using System;
|
|
using System.Text.RegularExpressions;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Rewrite;
|
|
using Microsoft.Net.Http.Headers;
|
|
|
|
namespace RewriteRules
|
|
{
|
|
public class MethodRules
|
|
{
|
|
#region snippet1
|
|
public static void RedirectXMLRequests(RewriteContext context)
|
|
{
|
|
var request = context.HttpContext.Request;
|
|
|
|
// Because we're redirecting back to the same app, stop
|
|
// processing if the request has already been redirected
|
|
if (request.Path.StartsWithSegments(new PathString("/xmlfiles")))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (request.Path.Value.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
var response = context.HttpContext.Response;
|
|
response.StatusCode = StatusCodes.Status301MovedPermanently;
|
|
context.Result = RuleResult.EndResponse;
|
|
response.Headers[HeaderNames.Location] =
|
|
"/xmlfiles" + request.Path + request.QueryString;
|
|
}
|
|
}
|
|
#endregion
|
|
}
|
|
|
|
#region snippet2
|
|
public class RedirectImageRequests : IRule
|
|
{
|
|
private readonly string _extension;
|
|
private readonly PathString _newPath;
|
|
|
|
public RedirectImageRequests(string extension, string newPath)
|
|
{
|
|
if (string.IsNullOrEmpty(extension))
|
|
{
|
|
throw new ArgumentException(nameof(extension));
|
|
}
|
|
|
|
if (!Regex.IsMatch(extension, @"^\.(png|jpg|gif)$"))
|
|
{
|
|
throw new ArgumentException("Invalid extension", nameof(extension));
|
|
}
|
|
|
|
if (!Regex.IsMatch(newPath, @"(/[A-Za-z0-9]+)+?"))
|
|
{
|
|
throw new ArgumentException("Invalid path", nameof(newPath));
|
|
}
|
|
|
|
_extension = extension;
|
|
_newPath = new PathString(newPath);
|
|
}
|
|
|
|
public void ApplyRule(RewriteContext context)
|
|
{
|
|
var request = context.HttpContext.Request;
|
|
|
|
// Because we're redirecting back to the same app, stop
|
|
// processing if the request has already been redirected
|
|
if (request.Path.StartsWithSegments(new PathString(_newPath)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (request.Path.Value.EndsWith(_extension, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
var response = context.HttpContext.Response;
|
|
response.StatusCode = StatusCodes.Status301MovedPermanently;
|
|
context.Result = RuleResult.EndResponse;
|
|
response.Headers[HeaderNames.Location] =
|
|
_newPath + request.Path + request.QueryString;
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
}
|