Безопасные символы для дружественного URL-адреса
Мне нужно создать сайт, на котором будут статьи, и я хотел бы сделать для него дружественные URL-адреса, например, URL-адрес страницы с
Название: Тест статьи
должен стать: http://www.example.com/articles/article_test
.
Конечно, мне нужно удалить некоторые символы из названия, например ?
или #
, но я не уверен, какие из них удалить.
Может кто-нибудь сказать мне, какие символы безопасны?
Ответы
Ответ 1
Процитировать раздел 2.3 RFC 3986:
"Символы, разрешенные в URI, но не имеющие зарезервированных цели называются безоговорочными. К ним относятся прописные и строчные буквы буквы, десятичные цифры, дефис, период, подчеркивание и тильда".
ALPHA DIGIT "-" / "." / "_" / "~"
Обратите внимание, что RFC 3986 содержит меньше зарезервированных знаков препинания, чем предыдущий RFC 2396.
Ответ 2
Есть два набора символов, на которые нужно обратить внимание: зарезервировано и небезопасно.
Символы зарезервированы:
- ampersand ( "&" )
- доллар ( "$" )
- знак плюс ( "+" )
- запятая ( "," )
- косая черта ( "/" )
- двоеточие ( ":" )
- точка с запятой ( ";" )
- equals ( "=" )
- вопросительный знак ( "?" )
- Символ "В" ( "@" )
- фунт ( "#" ).
Символами, которые обычно считаются небезопасными, являются:
- space ("")
- меньше и больше ( "< > " )
- открывать и закрывать скобки ( "[]" )
- открыть и закрыть фигурные скобки ( "{}" )
- pipe ( "|" )
- обратная косая черта ( "\" )
- caret ( "^" )
- процентов ( "%" )
Возможно, я забыл один или несколько, что приводит меня к тому, что я отвечаю на вопрос Карла V. В конечном счете вам, вероятно, лучше использовать "белый список" допустимых символов, а затем кодировать строку, а не пытаться оставаться в курсе символов, которые запрещены серверами и системами.
Ответ 3
Лучше всего сохранить только некоторые символы (белый список) вместо удаления определенных символов (черный список).
Вы можете технически разрешить любой символ, пока вы его правильно кодируете. Но, чтобы ответить в духе вопроса, вы должны разрешать только эти символы:
- Буквы нижнего регистра (конвертировать верхний регистр в нижний)
- Числа, от 0 до 9
- Тире - или подчеркивание _
- Тильда ~
Все остальное имеет потенциально особый смысл. Например, вы можете подумать, что можете использовать +, но его можно заменить пробелом. и также опасен, особенно если вы используете некоторые правила перезаписи.
Как и в случае с другими комментариями, ознакомьтесь со стандартами и спецификациями для полной информации.
Ответ 4
Всегда безопасно
Это безопасно (в теории/спецификации), в основном где угодно, кроме имени домена.
Процент-кодировать все, что не указано, и вам хорошо идти.
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 - _.
(с периодами только для расширений имени файла).
Ответ 5
unreserved = ALPHA/DIGIT/ "-" / "." / "_" / "~"
Ответ 6
Из контекста, который вы описываете, я подозреваю, что то, что вы на самом деле пытаетесь сделать, называется "SEO slug". Лучшей общеизвестной практикой для них является:
- Преобразовать в нижний регистр
- Преобразование целых последовательностей символов, отличных от a-z и 0-9, в один дефис (-) (не подчеркивание)
- Удалить "стоп-слова" из URL-адреса, т.е. не-значимо-индексируемые слова типа "a", "an" и "the"; Google "останавливать слова" для обширных списков.
Итак, в качестве примера, статья под заголовком "Использование! @% $* для представления ругательства в комиксах" будет иметь пучок "использования-представлять-присяга-комиксы".
Ответ 7
Глядя на 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).
Ответ 8
Формат для URI определяется в RFC 3986. Подробнее см. Раздел 3.3.
Ответ 9
С точки зрения SEO, дефис предпочтительнее над подчеркиваниями. Преобразуйте в нижний регистр, удалите все апострофы, а затем замените все не буквенно-цифровые строки символов на один дефис. Обрезайте лишние дефисы с начала и конца.
Ответ 10
У меня была аналогичная проблема, я хотел иметь довольно 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 "-";
}
}
Ответ 11
Мне было очень полезно кодировать мой 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);
Ответ 12
Я думаю, что вы ищете что-то вроде "URL Encoding" - кодирование URL-адреса, чтобы оно "безопасно" для использования в Интернете:
Вот ссылка на это. Если вам не нужны специальные символы, просто удалите все, что требует URL-кодирования:
http://www.w3schools.com/TAGS/ref_urlencode.asp
Ответ 13
Между 3-50 символами. Может содержать строчные буквы, цифры и специальные символы - точка (.), Тире (-), подчеркивание (_) и со скоростью (@).