Наконец я решил это двумя способами. Теперь опишу подробнее.
- Реализация UrlRules:
Я написал класс, который наследуется от IRule, например
public class UrlRules : IRule
{
public void ApplyRule(RewriteContext context)
{
var request = context.HttpContext.Request;
if (!IsValidUrl(request.Path))
{
var response = context.HttpContext.Response;
response.StatusCode = StatusCodes.Status404NotFound;
context.Result = RuleResult.EndResponse;
response.Headers[HeaderNames.Location] = "/home/error";
}
}
public bool IsValidUrl(string path)
{
bool urlValid = false;
switch (path)
{
case "/":
case "/about-us":
case "/about-us/":
case "/GetCountryInfo":
case "/pricing":
case "/pricing/":
case "/sign-in":
case "/sign-in/":
case "/sign-up":
case "/sign-up/":
urlValid = true;
break;
default:
urlValid = false;
break;
}
return urlValid;
}
}
Затем настройте маршрут как
app.UseMvc(routes =>
{
var rewrites = new RewriteOptions()
.Add(new UrlRules())
.AddRewrite(@"GetCountryInfo", "Home/GetCountryInfo", skipRemainingRules: true)
.AddRewrite(@"about-us", "Home/about", skipRemainingRules: true)
.AddRewrite(@"pricing", "Home/Pricing", skipRemainingRules: true)
.AddRewrite(@"sign-in", "Home/Sign_in", skipRemainingRules: true)
.AddRewrite(@"sign-up", "Home/Sign_up", skipRemainingRules: true);
app.UseRewriter(rewrites);
routes.MapRoute(
name:"default",
template: "{controller=Home}/{action=Index}/{id?}");
});
Это работает.
- Определение маршрута:
Это идеальный способ для меня. Просто определяя маршрут к каждому действию как
[Route("~/about-us")]
public IActionResult About()
{
return View();
}
Для меня это идеальное решение, потому что оно работает нормально.