Как перенаправить URL-адрес веб-сайта по умолчанию на пользовательский URL в. NET Core? - PullRequest
0 голосов
/ 26 февраля 2020

Я уверен, что это просто, и я просто что-то не понял, но кто-то может объяснить, как я могу перенаправить свои myDomain.com/ или localhost:12345/ URL-адреса на что-то вроде myDomain.com/lang/Controller/Index или localhost:12345/lang/Controller/Index?

Моя маршрутизация в Startup.cs выглядит следующим образом:

 app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "LocalizedDefault",
                    template: "{culture:culture}/{controller=Home}/{action=Index}/{id?}"); 
                    routes.MapRoute(
                    name: "default",
                    template: "{*catchall}",
                    defaults: new { controller = "Home", action = "RedirectToDefaultLanguage", culture = "en" });
            });

На данный момент я изменил файл launchSettings.json для запуска по желаемому URL, но этот тип решения не очень гибок и, как только я начну использовать сервер, мне все равно придется перенаправлять запросы на myDomain.com. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Сначала измените определение маршрутизации:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "LocalizedDefault",
        template: "{culture:regex(^[a-zA-Z]{{2}}(?:-[a-zA-Z]{{2}})*$)}/{controller=Home}/{action=Index}/{id?}"
        );
    routes.MapRoute(
        name: "default",
        template: "{controller}/{action}/{id?}",
        defaults: new { controller = "Home", action = "RedirectToDefaultLanguage" }
        );
});

Вы не хотите использовать универсальный маршрут, чтобы избежать слишком большого количества перенаправлений. Обратите внимание, что я использую ограничение регулярных выражений, чтобы убедиться, что культура представлена ​​в формате двух буклетов (en, it, fr) или имен с тегами basi c (en-US, it-IT, ...). Если вам нужна полная совместимость с rfc4647, вам нужно изменить регулярное выражение в ^[A-Za-z]{1,8}(?:-[A-Za-z0-9]{1,8})*$, но я думаю, что это будет слишком много (если вы не планируете предоставлять веб-сайт i-klingon XD).

Тогда действие RedirectToDefaultLanguage в HomeController:

public IActionResult RedirectToDefaultLanguage()
{
    var currentCulture = Request.RouteValues["culture"];
    var dest = Request.Path.Value == "/" ? "" : Request.Path.Value;
    if (!string.IsNullOrWhiteSpace(Request.QueryString.Value))
        dest += $"?{Request.QueryString}";
    if (currentCulture == null)
    {
        return RedirectPermanent($"/en{dest}");
    }
    return RedirectToActionPermanent($"{currentCulture}{dest}");
}
0 голосов
/ 26 февраля 2020

Неважно, это был действительно тупой вопрос. Просто используйте атрибут [Route("")] для любого действия контроллера, которое вы хотите вызвать для URL по умолчанию.

...