Плюс добавить строку запроса для сайта ASP.NET

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

/main.aspx?page=Page+Title+One

/main.aspx?page=Another+Article+Title

/main.aspx?page=Third+Page

Страница main.aspx получает данные строки запроса (Страница + Заголовок + Один) и использует ее как ключ для вытягивания соответствующего содержимого статьи из базы данных SQL-сервера. Фактическое название страницы хранится в db с пробелами вместо плюсов (например, "Название одной страницы" ).

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

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

/main.aspx?page=Page Title One

Я хочу сделать 301 постоянную переадресацию на:

/main.aspx?page=Page+Title+One

Чтобы это сделать, мне нужно проверить, имеет ли значение строки запроса плюсы или пробелы, однако, когда я получаю значение с помощью Request.QueryString [ "page" ], даже если в реальной строке quesry есть плюсы в ней. все равно получите строку с пробелами "Страница Title One".

Сайт работает на IIS6/Win 2003.

Как я могу это сделать?

Ответ 1

Ну, конечно, вы не можете поместить пробел в URI в любом случае. То, что вы можете сделать, это положить %20, в котором это способ кодирования пространства в любой точке URI, а также +, являющийся обычным способом кодирования пространства в части запроса, и рекомендуемый способ сделать это в той его части, потому что %20 может вызвать проблемы.

Из-за этого это приложение applicationplaceon application/x-www-form-urlencoded, и мы обычно заботимся о фактических отправленных данных, Request.QueryString[] делает unescaping для вас, превращая оба + и %20 в пространство.

Вы хотите посмотреть Request.RawUrl (возвращает строку) или Request.Url, который возвращает Uri. Вероятно, самым легким является передача Request.Url в UriBuilder, поэтому вы можете изменить только запрос и вернуть Uri.

Тем не менее, я бы рекомендовал обратный подход, если у вас возникли проблемы с дублирующимся контентом из-за двух возможных способов кодирования пробела в строке запроса, пойдите с рекомендуемой нормой и включите случаи %20 в +, а не наоборот.

var u = Request.Url;
if(u.Query.Contains("%20"))
{
    var ub = new UriBuilder(u);
    Console.WriteLine(ub.Query);
    string query = ub.Query;
    //note bug in Query property - it includes ? in get and expects it not to be there on set
    ub.Query = ub.Query.Replace("%20", "+").Substring(1);
    Response.StatusCode = 301;
    Response.RedirectLocation = ub.Uri.AbsoluteUri;
    Response.End();
}

Ответ 2

Используя Request["key"], он автоматически преобразует все знаки "+" в пробелы. Вам нужно использовать Request.RawUrl, чтобы увидеть, есть ли плюсовые знаки.

Кроме того, вы можете использовать System.Web.HttpUtility.ParseQueryString для анализа любого строкового запроса. Вы можете просто проверить, соответствует ли Request.QueryString.ToString().Contains("+") true, и делать логику оттуда.

Ответ 3

Знак + интерпретируется как пространство для URL-адресов.

То есть, чтобы URL кодировать пробел, вы можете использовать %20 или +.

См. этот ответ SO в "URL-кодирование символа пробела: + или %20?"

Ответ 4

Вы можете попробовать следующее:

Request.QueryString["page"].Trim();