Плюс (+) в аргументе MVC вызывает 404 на IIS 7.0

У меня есть маршрут 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. Это работает в моей dev-блоке, но не на промежуточном сервере. Я бы предпочел просто заставить его работать на сервере, так как у меня уже есть все, что было проверено и работает локально, но я не знаю, с чего начать искать конфигурацию сервера, чтобы заставить его вести себя одинаково.

Спасибо!

Ответ 1

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

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

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

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

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

Ответ 2

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

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

<configuration>
   ...
   <system.webServer>
      ...
      <security>
          <requestFiltering allowDoubleEscaping="true" />
      </security>
    </system.webServer>
    ...
</configuration>

Ответ 3

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