Плюс (+) в аргументе MVC вызывает 404 на IIS 7.0 - PullRequest
29 голосов
/ 31 июля 2010

У меня есть маршрут MVC, который дает мне ад на промежуточном сервере с IIS. Я работаю на сервере разработки Visual Studio 2010 локально.

Вот пример URL, который на самом деле работает на моем устройстве dev:

Root/CPUBoards/Full+Size

Results
Server Error404 - File or directory not found.
The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable.

Вот полное поведение, которое я вижу.

Localhost:

Root/CPUBoards/Full Size - Resolves
Root/CPUBoards/Full%20Size - Resolves
Root/CPUBoards/Full+Size - Resolves

промежуточный сервер с IIS 7.0:

Root/CPUBoards/Full Size - Resolves
Root/CPUBoards/Full%20Size - Resolves
Root/CPUBoards/Full+Size - 404 Not Found Error.

Есть идеи? Мне нужно работать с зашифрованной версией по нескольким причинам ... я не буду тратить на них ваше время.

HttpUtility.UrlEncode ("Full Size") возвращает версию с плюсом sing ... Full + Size. Это работает на моей коробке разработчика, но не на промежуточном сервере. Я предпочел бы просто заставить его работать на сервере, поскольку у меня уже есть все остальное, проверенное и работающее локально, но я не знаю, с чего начать поиск конфигурации сервера, чтобы заставить его вести себя так же.

Спасибо!

Ответы [ 3 ]

20 голосов
/ 05 ноября 2010

Это настройка безопасности IIS.Существует стандартный фильтр запросов, который отклоняет URL-адреса, содержащие символы + (плюс).

Вы можете отключить его для своей сети, добавив его в ваш web.config:

<configuration>
   ...
   <system.webServer>
      ...
      <security>
          <requestFiltering allowDoubleEscaping="true" />
      </security>
    </system.webServer>
    ...
</configuration>
20 голосов
/ 31 июля 2010

+ имеет специальное значение, являясь пробелом в application/x-www-form-urlencoded данных, таких как часть строки запроса URL.

В других частях URL, таких как компоненты пути, + буквальноозначает знак плюс.Поэтому преобразование Full+Size в незашифрованное имя Full Size нигде не должно работать.

Единственная правильная форма пробела в компоненте пути - %20.(Он по-прежнему работает, когда вы вводите фактический пробел, потому что браузер обнаруживает ошибку и исправляет ее для вас.) %20 также работает и с данными, закодированными в URL-адресе формы, поэтому обычно всегда безопаснее использовать это.

К сожалению, HttpUtility.UrlEncode обманчиво назван.Он выводит + в своем выводе вместо %20, так что это действительно кодировщик URL-адреса формы, а не стандартный URL-кодировщик.К сожалению, я не знаю функции ASP.NET для «действительно URL-кодирования» строк для использования в пути, поэтому все, что я могу порекомендовать, - это заменить строку с + на %20 после кодирования.

В качестве альтернативы, избегайте использования пробелов в частях пути, например.заменив их на -.Обычно заголовки 'slug' вставляются в URL-адреса, сокращая их до простых буквенно-цифровых символов и 'безопасной' пунктуации, чтобы избежать заполнения URL уродливыми %nn последовательностями.

4 голосов
/ 15 марта 2012

System.Web.HttpUtility.UrlPathEncode(string str) кодирует + в %20

...