2011-12-21 3 views
10

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

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

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

/main.aspx?page=Third+Page 

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

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

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

/main.aspx?page=Page Title One 

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

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

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

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

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

ответ

2

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

Из-за это подробно деле ввод применение/х-WWW-форм-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

Мои URL-адреса всегда использовали знак «плюс» только вместо белых пробелов или% 20, однако я вижу страницы в кеше в Google, похожие на эти 2: /main.aspx?page=KW1 KW2 и /main.aspx?page=KW1% 20KW2, которые являются неправильными и вызывают дублирование проблем с содержимым. Теперь я хочу, чтобы они соответствовали правильному URL-адресу, который является /main.aspx?page=KW1+KW2. –

+0

Это в значительной степени то, что я объяснял. Не уверен, что было непонятно, поэтому добавили пример кода, который, надеюсь, объяснит. –

+0

Спасибо, Джон, это именно то, что мне нужно :). Как пометить вопрос как ответ? –

3

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

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

См. this SO answer на «URL-кодирование символа пробела: + или% 20?»

4

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

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

+0

Это именно моя проблема. Я хочу иметь возможность провести различие между следующими двумя запросами GET: /main.aspx?page=KW1+KW2 и /main.aspx?page=KW1 KW2. –

+0

Посмотри мой оригинальный пост. Он выглядит как 'Request.QueryString.ToString(). Содержит (« + »)' даст вам, если это первый или второй случай. –

+0

Да, но это не решит неправильный URL-адрес в следующем формате /main.aspx?page=KW1 KW2 + KW3. –

0

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

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