Знак плюс в строке запроса для сайта ASP.NET - PullRequest
10 голосов
/ 22 декабря 2011

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

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

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

/main.aspx?page=Third+Page

Страница main.aspx получает данные строки запроса (например, Page + Название + Один) и использует их в качестве ключа для извлечения соответствующего содержимого статьи из базы данных сервера SQL. Фактический заголовок страницы хранится в БД с пробелами вместо плюсов (например, «Page Title One»).

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

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

/main.aspx?page=Page Title One

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 22 декабря 2011

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

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

3 голосов
/ 22 декабря 2011

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

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

* 1007.* См. этот SO-ответ на "URL, кодирующий символ пробела: + или% 20?"
2 голосов
/ 22 декабря 2011

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

Из-за этого подробное приложение-реализация / x-www-form-urlencoded и мы обычно заботимся о фактических отправленных данных, Request.QueryString[] делает эскапингдля вас, превратив + и %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();
}
0 голосов
/ 08 января 2015

Вы можете попробовать это:

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