При тестировании 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
во всех реализациях, которые я тестировал.
Вопросы:
Обновление: Chromium 70.0.3521.2 начал отклонять его, а Chrome 69.0.3497.42 все еще принимает его.
Согласно RFC 952, "Нет пробелов или символов пробела разрешено как часть имени". (ссылаясь на "Net, Host, Gateway или Domain name"). Я считаю, что конкретное правило является текущим (по состоянию на 2018 год) в отношении этого, так что похоже, что Firefox применяет это, в то время как другие браузеры более разрешительны.
См. Также: qaru.site/questions/107596/...
Вы ищете encodeURI()
:
console.log(new URL(encodeURI('https://a b')).host);
Для получения дополнительной информации см. MDN Docs на JavaScript encodeURI()
.
Если вы хотите взглянуть на RFC, вы обнаружите, что существуют ограниченные символы, которые действительны вообще в URL-адресах, и среди них нет пробелов (табуляции или пробелы).
Автоматическая замена, которую вы видите, является браузером, который помогает пользователю.
encodeURI()
прежде чем помещать что-либо вURL()
?