Плюс (+) в аргументе 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