Безопасные символы для дружественного 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 символами. Может содержать строчные буквы, цифры и специальные символы - точка (.), Тире (-), подчеркивание (_) и со скоростью (@).