Я создаю веб-сайт со статьями, и мне нужно, чтобы у статей были удобные URL-адреса на основе заголовка.
Например, если заголовок моей статьи "Article Test", я хотел бы, чтобы URL-адрес был http://www.example.com/articles/article_test.
Однако заголовки статей (как и любая строка) могут содержать несколько специальных символов, которые невозможно поместить буквально в мой URL-адрес. Например, я знаю, что нужно заменить ? или #, но не знаю всех остальных.
Какие символы разрешены в URL-адресах? Что безопасно хранить?
Аналогичный вопрос был здесь. Зацените, там тоже можно найти полезные ответы (их было довольно много). Rook 30.03.2009
Я переформулировал вопрос, чтобы он был более ясным. Вопросы и ответы полезны и хорошего качества. (48 человек, в том числе и я, добавили в избранное) На мой взгляд, его нужно открыть заново. Jonathan Allard 18.11.2020
Символы, которые разрешены в URI, но не имеют зарезервированного назначения, называются незарезервированными. К ним относятся прописные и строчные буквы, десятичные цифры, дефис, точка, подчеркивание и тильда.
ALPHA DIGIT "-" / "." / "_" / "~"
Обратите внимание, что RFC 3986 содержит меньше зарезервированных знаков препинания, чем более старый RFC 2396.
Ответ 2 · рейтинг 117 · Gary.Ray
Обратите внимание на два набора символов: зарезервировано и небезопасно.
Зарезервированные символы:
амперсанд (&)
доллар ($)
знак плюс (+)
запятая (,)
косая черта (/)
двоеточие (:)
точка с запятой (;)
равно (=)
вопросительный знак (?)
Символ 'At' (@)
фунт (#).
Небезопасными обычно считаются следующие символы:
Космос ( )
меньше и больше (‹›)
открывающие и закрывающие скобки ([])
открывающие и закрывающие фигурные скобки ({})
труба (|)
обратная косая черта ()
каретка (^)
процентов (%)
Возможно, я забыл один или несколько, из-за чего я повторяю Ответ Карла V. В конечном итоге вам, вероятно, будет лучше использовать белый список разрешенных символов и затем кодировать строку, чем пытаться быть в курсе символов, которые запрещены серверами и системами.
Ответ 3 · рейтинг 47 · Beejor
Всегда в безопасности
Теоретически и согласно спецификации они безопасны практически везде, кроме доменного имени. Процентное кодирование всего, чего нет в списке, и готово.
A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;
Иногда безопасно
Безопасно только при использовании в определенных компонентах URL; используйте с осторожностью.
Paths: + & =
Queries: ? /
Fragments: ? / # + & =
Никогда не безопасно
Согласно спецификации URI (RFC 3986), все остальные символы должны быть закодированы в процентах. Это включает:
Если максимальная совместимость вызывает беспокойство, ограничьте набор символов A-Z a-z 0-9 - _. (с точками только для расширений файлов).
Помните о контексте
Даже если он действителен в соответствии со спецификацией, URL-адрес может быть небезопасным в зависимости от контекста. Например, URL-адрес file: ///, содержащий недопустимые символы имени файла, или компонент запроса, содержащий?, = И &, если он не используется в качестве разделителей. Правильная обработка этих случаев, как правило, зависит от ваших сценариев, и ее можно обойти, но об этом следует помнить.
Ответ 4 · рейтинг 43 · carl
Лучше оставить только некоторые символы (белый список) вместо удаления определенных символов (черный список).
Технически вы можете разрешить любой символ, если вы правильно его кодируете. Но, чтобы ответить в духе вопроса, вы должны разрешить только эти символы:
Строчные буквы (преобразование верхнего регистра в нижний)
Цифры от 0 до 9
Тире - или подчеркивание _
Тильда ~
Все остальное имеет потенциально особое значение. Например, вы можете подумать, что можете использовать +, но его можно заменить пробелом. & тоже опасно, особенно при использовании некоторых правил перезаписи.
Как и в случае с другими комментариями, ознакомьтесь со стандартами и спецификациями для получения полной информации.
Из контекста, который вы описываете, я подозреваю, что то, что вы на самом деле пытаетесь сделать, называется "SEO-слагом". Лучшая общеизвестная практика для них:
Преобразовать в нижний регистр
Преобразование целых последовательностей символов, кроме a-z и 0-9, в один дефис (-) (без подчеркивания)
Удалите из URL-адреса "стоп-слова", т. Е. Бессмысленно индексируемые слова, такие как "a", "an" и "the"; Стоп-слова Google для обширных списков
Так, например, статья под названием "Использование! @% $ * Для представления ругательств в комиксах" получит фрагмент "использование-представлять-ругательства-комиксы".
Формат URI определен в RFC 3986. См. Подробности в разделе 3.3.
Ответ 9 · рейтинг 6 · mpen
С точки зрения SEO дефисы предпочтительнее подчеркивания. Преобразуйте в нижний регистр, удалите все апострофы, затем замените все не буквенно-цифровые строки символов одним дефисом. Обрежьте лишние дефисы в начале и в конце.
Ответ 10 · рейтинг 3 · Lubomir Toshev
У меня была похожая проблема. Я хотел иметь красивые URL-адреса и пришел к выводу, что я должен разрешать в URL-адресах только буквы, цифры и _.
Это нормально, но потом я написал красивое регулярное выражение и понял, что он распознает, что все символы UTF-8 не являются буквами в .NET, и был запутан. Похоже, это известная проблема для механизма регулярных выражений .NET. Итак, я пришел к такому решению:
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 characters, because
/// .NET implementation of regex do not handle Unicode characters. 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 · рейтинг 1 · DIY-Forum
Я обнаружил, что очень полезно закодировать свой URL-адрес в безопасный, когда я возвращал значение через Ajax / PHP в URL-адрес, который затем снова читался страницей.
Вывод PHP с кодировщиком URL для специального символа &:
// PHP returning the success information of an Ajax request
echo "".str_replace('&', '%26', $_POST['name']) . " category was changed";
// JavaScript sending the value to the 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 · Andy White
Я думаю, вы ищете что-то вроде кодирования URL - кодирования URL так, чтобы он безопасно для использования в Интернете:
Вот ссылка на это. Если вам не нужны специальные символы, просто удалите те, которые требуют кодировки URL: