Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Какие символы безопасны для создания URL-адресов?

Автор вопроса: PauloОтветов: 12

Я создаю веб-сайт со статьями, и мне нужно, чтобы у статей были удобные URL-адреса на основе заголовка.

Например, если заголовок моей статьи "Article Test", я хотел бы, чтобы URL-адрес был http://www.example.com/articles/article_test.

Однако заголовки статей (как и любая строка) могут содержать несколько специальных символов, которые невозможно поместить буквально в мой URL-адрес. Например, я знаю, что нужно заменить ? или #, но не знаю всех остальных.

Какие символы разрешены в URL-адресах? Что безопасно хранить?

  • Аналогичный вопрос был здесь. Зацените, там тоже можно найти полезные ответы (их было довольно много). Rook 30.03.2009
  • Я переформулировал вопрос, чтобы он был более ясным. Вопросы и ответы полезны и хорошего качества. (48 человек, в том числе и я, добавили в избранное) На мой взгляд, его нужно открыть заново. Jonathan Allard 18.11.2020

urlfriendly-url

Ответы

Ответ 1 · рейтинг 235 · Skip Head

Чтобы процитировать раздел 2.3 RFC 3986:

Символы, которые разрешены в 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), все остальные символы должны быть закодированы в процентах. Это включает:

    <space> <control-characters> <extended-ascii> <unicode>
    % < > [ ] { } | \ ^

Если максимальная совместимость вызывает беспокойство, ограничьте набор символов A-Z a-z 0-9 - _. (с точками только для расширений файлов).

Помните о контексте

Даже если он действителен в соответствии со спецификацией, URL-адрес может быть небезопасным в зависимости от контекста. Например, URL-адрес file: ///, содержащий недопустимые символы имени файла, или компонент запроса, содержащий?, = И &, если он не используется в качестве разделителей. Правильная обработка этих случаев, как правило, зависит от ваших сценариев, и ее можно обойти, но об этом следует помнить.

Ответ 4 · рейтинг 43 · carl

Лучше оставить только некоторые символы (белый список) вместо удаления определенных символов (черный список).

Технически вы можете разрешить любой символ, если вы правильно его кодируете. Но, чтобы ответить в духе вопроса, вы должны разрешить только эти символы:

  1. Строчные буквы (преобразование верхнего регистра в нижний)
  2. Цифры от 0 до 9
  3. Тире - или подчеркивание _
  4. Тильда ~

Все остальное имеет потенциально особое значение. Например, вы можете подумать, что можете использовать +, но его можно заменить пробелом. & тоже опасно, особенно при использовании некоторых правил перезаписи.

Как и в случае с другими комментариями, ознакомьтесь со стандартами и спецификациями для получения полной информации.

Ответ 5 · рейтинг 19 · Philzen

Глядя на RFC3986 - Uniform Resource Identifier (URI): Generic Syntax, ваш вопрос вращается вокруг путь в 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 - Uniform Resource Locators (URL).

Ответ 6 · рейтинг 12 · chaos

Из контекста, который вы описываете, я подозреваю, что то, что вы на самом деле пытаетесь сделать, называется "SEO-слагом". Лучшая общеизвестная практика для них:

  1. Преобразовать в нижний регистр
  2. Преобразование целых последовательностей символов, кроме a-z и 0-9, в один дефис (-) (без подчеркивания)
  3. Удалите из URL-адреса "стоп-слова", т. Е. Бессмысленно индексируемые слова, такие как "a", "an" и "the"; Стоп-слова Google для обширных списков

Так, например, статья под названием "Использование! @% $ * Для представления ругательств в комиксах" получит фрагмент "использование-представлять-ругательства-комиксы".

Ответ 7 · рейтинг 11 · LKK

unreserved = АЛЬФА / ЦИФРА / "-" / "." / "_" / "~"

Ответ 8 · рейтинг 6 · joschi

Формат 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:

Справочник по кодированию URL-адресов HTML

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы