Безопасные символы для дружественного url
мне нужно сделать веб-сайт, на котором будут статьи, и я хотел бы сделать для него дружественные URL-адреса, например URL-адрес страницы с
Название: Тест-Статьи
должны стать: http://www.example.com/articles/article_test
.
конечно, мне нужно удалить некоторые символы из названия, как ?
или #
, но я не уверен, какие из них удалить.
может кто-нибудь сказать мне, какие символы безопасны для хранения?
13 ответов
процитировать раздел 2.3 RFC 3986:
" символы, которые разрешены в URI, но не имеют зарезервированного цель называется неограниченной. Они включают верхний и Нижний регистры буквы, цифры, дефис, точка, подчеркивание, Тильда."
ALPHA DIGIT "-" / "." / "_" / "~"
обратите внимание, что RFC 3986 содержит меньше зарезервированных знаков препинания, чем более старый RFC 2396.
есть два набора символов, которые вам нужно следить за:резерв и небезопасных.
на резерв символы:
- амперсанд ("&") доллар
- знак плюс ("+")
- запятая (",")
- косая черта ("/")
- двоеточие (":")
- точка с запятой (";")
- равен ("=")
- вопрос Марк ("?")
- 'At' символ ("@")
- фунта ("#").
символы обычно считаются небезопасных являются:
- пробел (" ")
- меньше и больше ("")
- открыть и закрыть скобки ("[]")
- открыть и закрыть фигурные скобки ("{}")
- трубы ("|")
- обратная косая черта ("\")
- caret ("^")
- процентов ( " % " )
возможно, я забыл один или несколько, что приводит к тому, что я повторяю ответ Карла V. В долгосрочной перспективе вам, вероятно, лучше использовать "белый список" разрешенных символов, а затем кодировать строку, а не пытаться оставаться в курсе символов, которые запрещены серверами и системами.
лучше всего хранить только некоторые символы (белый список) вместо удаления определенных символов (черный список).
вы можете технически разрешить любой символ, если вы правильно его кодируете. Но, чтобы ответить в духе вопроса, Вы должны разрешить только эти символы:
- строчные буквы (преобразовать верхний регистр в Нижний)
- цифры от 0 до 9
- тире или подчеркивания _
- Тильда ~
все остальное имеет потенциально особое значение. Например, вы можете подумать, что можете использовать+, но его можно заменить пробелом. & также опасно, особенно при использовании некоторых правил перезаписи.
Как и в других комментариях, ознакомьтесь со стандартами и спецификациями для получения полной информации.
Всегда Безопасно
они безопасны (в теории / спецификации), в основном в любом месте, кроме доменного имени.
процентов-закодировать ничего не указано, и вы хорошо идти.
A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;
Иногда Безопасный
безопасно только при использовании в определенных компонентах URL; используйте с осторожностью.
Paths: + & =
Queries: ? /
Fragments: ? / # + & =
Никогда Не Было
согласно спецификации URI (RFC 3986), все остальные символы должны быть закодированы в процентах. Сюда входят:
<space> <control-characters> <extended-ascii> <unicode>
% < > [ ] { } | \ ^
если максимальное совместимость-это проблема, ограничьте кодировку A-Z a - z 0-9 -_.
(с периодами только для расширения).
смотрим RFC3986-универсальный идентификатор ресурса (URI): универсальный синтаксис ваш вопрос вращается вокруг путь компонент URI.
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose
цитирование раздела 3.3, допустимые символы для URI segment
типа pchar
:
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
что ломается:
ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded
"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
":" / "@"
или другими словами: вы можете использовать любой (бесконтрольный) символ из таблица ASCII, за исключением /
, ?
, #
, [
и ]
.
это понимание подкрепляется RFC1738-унифицированные локаторы ресурсов (URL).
из контекста, который вы описываете, я подозреваю, что то, что вы на самом деле пытаетесь сделать, называется "SEO slug". Лучшая общеизвестная практика для тех, кто:
- преобразовать в нижний регистр
- преобразование целых последовательностей символов, отличных от a-z и 0-9, в один дефис ( - ) (не подчеркивание)
- удалить "стоп-слова" из URL-адреса, т. е. не-значимо-индексируемые слова, такие как "a", " an " и "the"; Google "стоп-слова" для обширных списки
Итак, в качестве примера, статья под названием " Использование !@%$* для представления ругани в комиксах "получил бы слиток" usage-represent-swearing-comics".
с точки зрения SEO дефисы предпочтительнее подчеркиваний. Преобразуйте в нижний регистр, удалите все апострофы, затем замените все не буквенно-цифровые строки символов одним дефисом. Обрезать лишние дефисы от начала и до конца.
У меня была аналогичная проблема, я хотел иметь красивые URL - адреса и пришел к выводу, что я должен разрешать только буквы, цифры и _ в URL-адресах. Это нормально, тогда я написал хорошее регулярное выражение, и я понял, что он распознает все символы UTF8 не Буквы в .NET и был ввернут. Это, по-видимому, проблема ноу для .NET regex engine. Поэтому я добрался до этого решения:
private static string GetTitleForUrlDisplay(string title)
{
if (!string.IsNullOrEmpty(title))
{
return Regex.Replace(Regex.Replace(title, @"[^A-Za-z0-9_-]", new MatchEvaluator(CharacterTester)).Replace(' ', '-').TrimStart('-').TrimEnd('-'), "[-]+", "-").ToLower();
}
return string.Empty;
}
/// <summary>
/// All characters that do not match the patter, will get to this method, i.e. useful for unicode chars, because
/// .NET impl of regext do not handle unicode chars. So we use char.IsLetterOrDigit() which works nicely and we
/// return what we approve and return - for everything else.
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static string CharacterTester(Match m)
{
string x = m.ToString();
if (x.Length > 0 && char.IsLetterOrDigit(x[0]))
{
return x.ToLower();
}
else
{
return "-";
}
}
Я нашел очень полезным закодировать мой url в безопасный, когда я возвращал значение через ajax / php в url, который затем был снова прочитан страницей.
вывод PHP с кодировщиком url для специального символа&
//PHP returning the sucess info of ajax request
echo "".str_replace('&','%26',$_POST['name'])." category was changed";
//javascript sending the value to url
window.location.href='time.php?return=updated&val='+msg;
//javascript/php executing the function printing the value of the url,
//now with the text normally lost in space because of the reserved & character.
setTimeout("infoApp('updated','<?php echo $_GET['val'];?>');",360);
надеюсь, кто-нибудь найдет мои маленькие извлечения кода полезными! :)
Я думаю, вы ищете что - то вроде "кодирования URL" - кодирования URL-адреса, чтобы его "безопасно" использовать в интернете:
вот ссылка для этого. Если вы не хотите никаких специальных символов, просто удалите все, что требует кодировки URL:
между 3-50 персонажей. Может содержать строчные буквы, цифры и специальные символы - точка(.), тире(-), подчеркивание(_) и по курсу(@).