URL Api: обработка пробелов в URL

1

При тестировании API-интерфейсов URL я заметил разницу в обработке URL-адресов с пробелами в разных браузерах:

console.log(new URL('https://a b').host)

В Firefox он выдает ошибку:

TypeError: https://a b is not a valid URL.

Но в других браузерах он будет принимать URL-адрес и распечатать a%20b. Например, Brave, Opera и Chrome.

Реализации, похоже, согласны с тем, что пробелы в имени пути действительны, и они автоматически будут процитировать их:

console.log(new URL('https://a/b c').pathname)

Печать /b%20c во всех реализациях, которые я тестировал.

Вопросы:

  • Правильно ли, что пробелы в имени хоста и в имени пути действительны?
  • Используется ли такая же логика для других пространственных символов (например, вкладок)?
  • Это просто ошибка в Firefox, или есть ли больше браузеров, которые будут интерпретировать пробелы по-разному?

Обновление: Chromium 70.0.3521.2 начал отклонять его, а Chrome 69.0.3497.42 все еще принимает его.

  • 0
    Как насчет вызова encodeURI() прежде чем помещать что-либо в URL() ?
  • 0
    @WilliamChong Я хотел использовать API URL, чтобы определить, может ли какой-либо текст быть URL-адресом (например, «example.com») или просто текстом. Идея состояла в том, чтобы проверить, является ли «https: // <текст>» действительным URL. Но если разрешены пробелы, этот подход не будет работать, так как почти любой случайный текст пройдет эту проверку.
Теги:
url

3 ответа

1
Лучший ответ

Согласно RFC 952, "Нет пробелов или символов пробела разрешено как часть имени". (ссылаясь на "Net, Host, Gateway или Domain name"). Я считаю, что конкретное правило является текущим (по состоянию на 2018 год) в отношении этого, так что похоже, что Firefox применяет это, в то время как другие браузеры более разрешительны.

См. Также: qaru.site/questions/107596/...

1

Вы ищете encodeURI():

console.log(new URL(encodeURI('https://a b')).host);

Для получения дополнительной информации см. MDN Docs на JavaScript encodeURI().

0

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

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

  • 0
    Наиболее близким, что я вижу в RFC, является следующее: «В некоторых случаях может потребоваться добавление лишних пробелов (пробелов, разрывов строк, табуляции и т. Д.), Чтобы разбивать длинные URL-адреса на строки. Пробельные символы следует игнорировать при извлечении URL-адреса. " Звучит немного расплывчато, но, по крайней мере, это какой-то аргумент в пользу трактовки «http: // a b» как допустимого URL. Возможно браузеры правы, чтобы принять это.
  • 1
    Нет, есть список допустимых символов. Строка, о которой вы говорите, - это печать URL-адресов, например, в текстовых документах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню