Почему все веб-сайты ASP.NET MVC позволяют и игнорируют строку "/(F())/" перед ЛЮБОЙ URL?

Я заметил, что запросы к моему веб-приложению ASP.NET преуспевают, даже если я префикс URL с /(F())/, что является бессмыслицей. Вызывается обычный метод действия. Request.Url не отображает префикс URL. Поэтому, если я запрашиваю /(F())/x, действие видит Request.Url == "/x"

Затем я попробовал другие сайты ASP.NET MVC, такие как переполнение стека:

qaru.site/info/504961/...

Согласно Fiddler, запрос делается в соответствии с назначением:

введите описание изображения здесь

Как вы видите, URL-адрес запроса верен, и сервер отвечает без перенаправления с полным контентом. В окне браузера также отображается этот URL.

Этот URL-адрес работает. Поэтому я пришел к выводу, что что-то в этой структуре заставляет этот запрос перезаписываться и префикс отбрасывается. Похоже, что приложение Qaru не знало префикса.

Тот же результат встречается в новом приложении MVC, созданном в Visual Studio 2017 на .NET 4.6.2 в Windows 7.

Другая забавная жертва: https://www.microsoft.com/(F(blah))/en-us/default.aspx (Домашняя страница Microsoft).

Строка (F()) не является специальной. См. Комментарии для других строк, которые работают, например. /(F(pV0)).

Так как мой код ASP.NET слеп к исходному URL (Request.Url не содержит префикс), я, похоже, даже не могу обнаружить это условие и не выполнить запрос.

Я не подтвердил, что это проблема MVC. Кажется, трудно найти виновника в огромном море функциональности, с которым поставляется ASP.NET + IIS. Кто знает, какие функции включены по умолчанию?! Я не думаю, что кто-то действительно знает:)

По крайней мере, это проблема SEO, но мне также мешает не знать, что происходит. Вот почему я расследую. Какое поведение и как избавиться от него?

Ответ 1

Это вызвано набором функций cookie без ASP.NET. Теперь URL-адрес может выглядеть следующим образом:

http://example.com/MyWebApplication/(A(XXXX)S(XXXX)F(XXXX))/home.aspx

Разрушение:

  • A (XXXX): Это анонимный идентификатор. Он используется для идентификации (анонимного) пользователя, обращающегося к вашему приложению. Строка может быть или не быть зашифрованной, в зависимости от ваших настроек конфигурации в разделе.
  • S (XXXX): Это идентификатор сеанса (тот же, что и для V1.1).
  • F (XXXX): Это билет проверки подлинности форм.

Поскольку режим cookieless полностью устарел, вызывает проблемы с SEO и путаницу. Я рекомендую немедленно отключить все возможные cookieless-функции на всех сайтах ASP.NET.

Для каждой из вышеперечисленных функций (аутентификация форм, анонимная идентификация и состояние сеанса) вы можете контролировать, когда и когда будет использоваться функция без файлов cookie, и когда вместо нее будет использоваться функция cookieless. Настройка конфигурации, управляющая этим: cookieless = "UseCookies | UseUri | UseDeviceProfile | AutoDetect"

В моем случае я установил:

<anonymousIdentification enabled="false" />
<sessionState ... cookieless="UseCookies" />

Вам нужно будет адаптировать это к вашим потребностям.

Это, надеюсь, относится к генерации этих URL-адресов, но, похоже, это не мешает платформе (молча) принимать такой URL-адрес. Документация утверждает, что заголовок AspFilterSessionId будет присутствовать, но я обнаружил, что это не так.

Пока у меня нет решения для блокировки запросов на эти нежелательные URL-адреса.