MVC Core: неверный URL ссылки без косой черты - PullRequest
0 голосов
/ 05 сентября 2018

Я разработал веб-приложение mvc core 2.1, которое развернуто под iis. Но у меня проблема с двигателем маршрутизации. все работает нормально, когда я звоню на сайт с этим URL:

https://hostname/subfolder1/subfolder2/

но когда я звоню на сайт без косой черты (https://hostname/subfolder1/subfolder2),, мои ссылки на главной странице не работают, потому что они указывают на неправильный URL-адрес. правильный URL-адрес: https://hostname/subfolder1/subfolder2/link1?param=HelloWorld

если я вызываю главную страницу без косой черты, ссылки выглядят так: https://hostname/subfolder1/link1?param=HelloWorld

значит, одна подпапка отсутствует.

мой маршрут:

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Portal}/{action=Index}/{id?}"
            );
        });

это соответствующий код моего взгляда:

<a class="app-tile" href="@app.Url" title="@app.Description" >

где @ app.Url выглядит как "./link1?param=HelloWorld"

что мне нужно сделать, чтобы можно было использовать оба URL-адреса (с косой чертой и без нее)?

может быть, перенаправить весь запрос без слеша на URL с косой чертой? но как лучше это делать?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Проблема в том, что вы используете относительные URL-адреса и в зависимости от наличия или отсутствия косой черты в конце базового URL-адреса они будут обрабатываться по-разному.

  1. С косой чертой в конце базовый URL интерпретируется как каталог, поэтому наличие ссылки на что-то вроде link1 будет интерпретироваться как под этим каталогом.

  2. Без косой черты в конце базовый URL интерпретируется как файл , поэтому ссылка на что-то вроде link1 будет интерпретироваться как одноуровневый элемент в том же каталоге, т.е. часть пути, по которой имеет косую черту.

Это не имеет никакого отношения к вашему приложению, а именно к тому, как относительные URL обрабатываются всеми браузерами. Исправление заключается в использовании относительных абсолютных URL-адресов для ссылок, изображений, сценариев и т. Д. По сути, это означает, что вы ссылаетесь на все, начиная с корневого уровня документа, с предыдущей косой чертой. Итак, вместо чего-то вроде:

<a href="link1">Link 1</a>

Вместо этого используйте:

<a href="/subfolder1/subfolder2/link1">

Таким образом вы устраняете неоднозначность того, как должны объединяться пути к базовому URL и URL-адресу ссылки, и это всегда хороший URL-адрес независимо от наличия завершающей косой черты.

Что касается ASP.NET Core, если вы используете встроенную функцию генерации URL, он будет обрабатывать прикрепление таких вещей, как виртуальные пути, к началу ваших ссылок для вас. Например, если ваш сайт размещен в виртуальном каталоге вашего домена по адресу /subfolder1, то когда вы делаете что-то вроде:

<a asp-action="Link1Action" asp-controller="Subfolder2">Link 1</a>

Тогда сгенерированный атрибут href будет правильным /subfolder1/subfolder2/link1.

Вы также можете использовать Url.Content, который будет отображаться в корне документа вашего сайта:

<a href="@Url.Content("~/subfolder2/link1")">Link 1</a>

Затем, предполагая, что ваш root - http://hostname/subfolder1, он снова создаст правильный URL, который вам нужен. В представлениях Razor вы также можете обозначить это просто:

<a href="~/subfolder2/link1`>Link 1</a>

Конструкция ~/ не поддерживается в URL-адресах, но Razor понимает это как ссылку на корневой каталог вашего документа и будет анализировать и заменять правильный URL-адрес при отображении вашего ответа для ответа.

0 голосов
/ 05 сентября 2018

Вы можете настроить routeOptions для AppendTrailingSlash или удалить его. см. пример ниже

services.Configure<RouteOptions>(options => options.AppendTrailingSlash = true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...