Плюс добавить строку запроса для сайта 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();