Как вы безопасно кодируете URL-адрес с помощью JavaScript, чтобы его можно было поместить в строку GET?
var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;
Я предполагаю, что вам нужно закодировать переменную myUrl
на этой второй строке?
Проверьте встроенную функцию encodeURIComponent(str)
и encodeURI(str)
.
В вашем случае это должно работать:
var myOtherUrl =
"http://example.com/index.html?url=" + encodeURIComponent(myUrl);
escape
также является допустимым вариантом.
encodeURI
не совсем безопасен для кодирования URL.
У вас есть три варианта:
escape()
не будет кодироваться: @*/+
encodeURI()
не будет кодироваться: ~!@#$&*()=:/,;?+'
encodeURIComponent()
не будет кодироваться: ~!*()'
Но в вашем случае, если вы хотите передать URL в параметр GET
другой страницы, вы должны использовать escape
или encodeURIComponent
, но не encodeURI
.
Смотрите вопрос о переполнении стека Лучшая практика: escape или encodeURI/encodeURIComponent для дальнейшего обсуждения.
%uxxx
.
Придерживайтесь encodeURIComponent()
. Функция encodeURI()
не требует кодирования многих символов, имеющих смысловое значение в URL-адресах (например, "#", "?" И "&" ). escape()
устарел и не удосуживается кодировать символы "+", которые будут интерпретироваться как кодированные пробелы на сервере (и, как отмеченные другими здесь, неправильно кодируют URL-символы, отличные от ASCII).
Существует приятное объяснение разницы между encodeURI()
и encodeURIComponent()
в другом месте. Если вы хотите что-то закодировать, чтобы можно было безопасно включить его в качестве компонента URI (например, как параметр строки запроса), вы хотите использовать encodeURIComponent()
.
Лично я считаю, что многие API-интерфейсы хотят заменить "" на "+", поэтому я использую следующее:
encodeURIComponent(value).replace(/%20/g,'+');
escape
реализуется по-разному в разных браузерах, и encodeURI
не кодирует большинство символов, которые являются функциональными в URI (например, # и даже /) - он используется для использования на полном URI/URL, не нарушая его.
ПРИМЕЧАНИЕ. Вы используете encodeURIComponent для значений строки запроса (не имена полей/значений и, определенно, не весь URL-адрес). Если вы сделаете это любым другим способом, он не будет кодировать символы типа =,?, &, Возможно, оставив вашу строку запроса открытой.
Пример:
const escapedValue = encodeURIComponent(value).replace(/%20/g,'+');
const url = 'http://example.com/?myKey=' + escapedValue;
http://somedomain/this dir has spaces/info.php?a=this has also spaces
. Его следует преобразовать в: http://somedomain/this%20dir%20has%spaces/info.php?a=this%20has%20also%20spaces
но многие реализации допускают http://somedomain/this%20dir%20has%spaces/info.php?a=this%20has%20also%20spaces
«% 20» в строке запроса на «+ ». Тем не менее, вы не можете заменить «% 20» на «+» в разделе пути URL-адреса, это приведет к ошибке «Не найдено», если у вас нет каталога с +
вместо пробела.
Если вы используете jQuery, я бы пошел на метод $.param
. Этот URL-адрес кодирует поля сопоставления объектов для значений, которые легче читать, чем вызов метода escape для каждого значения.
$.param({a:"1=2", b:"Test 1"}) // gets a=1%3D2&b=Test+1
Чтобы закодировать URL, как было сказано ранее, у вас есть две функции:
encodeURI()
и
encodeURIComponent()
Причина заключается в том, что первый сохраняет URL-адрес, рискуя оставить слишком много вещей без сохранения, а второй кодирует все необходимое.
Во-первых, вы можете скопировать недавно экранированный URL-адрес в адресную строку (например), и это сработает. Однако ваш неограниченный '& будет вмешиваться в полевые разделители, '= будет мешать именам и значениям полей, а' + будет выглядеть как пробелы. Но для простых данных, когда вы хотите сохранить характер URL-адреса того, что вы ускользаете, это работает.
Во-вторых, все, что вам нужно сделать, чтобы убедиться, что ничто в вашей строке не связано с URL-адресом. Он оставляет различные несущественные символы незанятыми, чтобы URL-адрес оставался максимально понятным для человека без помех. URL-адрес, закодированный таким образом, больше не будет работать как URL-адрес, не отменив его.
Итак, если вы можете потратить время, вы всегда хотите использовать encodeURIComponent() - перед добавлением пар имя/значение кодируйте имя и значение с помощью этой функции, прежде чем добавлять их в строку запроса.
У меня тяжелое время придумывать причины использования encodeURI() - я оставлю это более умным людям.
encodeURIComponent() - это путь.
var myOtherUrl = "http://example.com/index.html?url=" + encodeURIComponent(myUrl);
НО вы должны иметь в виду, что существуют небольшие отличия от php version urlencode(), и, как упоминалось в @CMS, он не будет кодировать каждый char. Ребята в http://phpjs.org/functions/urlencode/ сделали js эквивалентным phpencode():
function urlencode(str) {
str = (str + '')
.toString();
// Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current
// PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following.
return encodeURIComponent(str)
.replace(/!/g, '%21')
.replace(/'/g, '%27')
.replace(/\(/g, '%28')
.
replace(/\)/g, '%29')
.replace(/\*/g, '%2A')
.replace(/%20/g, '+');
}
Аналогичная вещь, которую я пробовал с помощью обычного javascript
function fixedEncodeURIComponent(str){
return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}
Чтобы предотвратить двойное кодирование, рекомендуется декодировать url перед кодированием (если вы имеете дело с введенными пользователем URL-адресами, например, которые могут быть уже закодированы).
Допустим, что мы имеем abc%20xyz 123
как вход (одно пространство уже закодировано):
encodeURI("abc%20xyz 123") // wrong: "abc%2520xyz%20123"
encodeURI(decodeURI("abc%20xyz 123")) // correct: "abc%20xyz%20123"
Ничего не работало для меня. Все, что я видел, это HTML-страница входа в систему, возвращающаяся на клиентскую сторону с кодом 200. (302 сначала, но тот же Ajax-запрос, загружающий страницу входа в другой Ajax-запрос, который должен был быть перенаправлением, а не загрузкой простого текст страницы входа в систему).
В контроллере входа я добавил эту строку:
Response.Headers["land"] = "login";
И в глобальном обработчике Ajax я сделал это:
$(function () {
var $document = $(document);
$document.ajaxSuccess(function (e, response, request) {
var land = response.getResponseHeader('land');
var redrUrl = '/login?ReturnUrl=' + encodeURIComponent(window.location);
if(land) {
if (land.toString() === 'login') {
window.location = redrUrl;
}
}
});
});
Теперь у меня нет никаких проблем, и это работает как шарм.
Кодировать строку URL
var url = $(location).attr('href'); //get current url
//OR
var url = 'folder/index.html?param=#23dd&noob=yes'; //or specify one
var encodedUrl = encodeURIComponent(url);
console.log(encodedUrl);
//outputs folder%2Findex.html%3Fparam%3D%2323dd%26noob%3Dyes
for more info go http://www.sitepoint.com/jquery-decode-url-string
Вы можете использовать библиотеку esapi и закодировать свой url, используя следующую функцию. Функция переносит, что '/' не теряются для кодирования, пока остальная часть текстового содержимого закодирована:
function encodeUrl(url)
{
String arr[] = url.split("/");
String encodedUrl = "";
for(int i = 0; i<arr.length; i++)
{
encodedUrl = encodedUrl + ESAPI.encoder().encodeForHTML(ESAPI.encoder().encodeForURL(arr[i]));
if(i<arr.length-1) encodedUrl = encodedUrl + "/";
}
return url;
}