Domanda Codifica URL in JavaScript?


Come si codifica in modo sicuro un URL utilizzando JavaScript in modo che possa essere inserito in una stringa GET?

var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;

Suppongo che tu abbia bisogno di codificare il myUrl variabile su quella seconda linea?


2120
2017-12-02 02:37


origine


risposte:


Scopri la funzione integrata encodeURIComponent(str) e encodeURI(str).
Nel tuo caso, questo dovrebbe funzionare:

var myOtherUrl = 
       "http://example.com/index.html?url=" + encodeURIComponent(myUrl);

2489
2017-12-02 02:43



Hai tre opzioni:

  • escape() non codificherà: @*/+

  • encodeURI() non codificherà: ~!@#$&*()=:/,;?+'

  • encodeURIComponent() non codificherà: ~!*()'

Ma nel tuo caso, se vuoi passare un URL in un GET parametro di un'altra pagina, dovresti usare escape o encodeURIComponent, ma no encodeURI.

Vedi la domanda Overflow dello stack Best practice: escape, o encodeURI / encodeURIComponent per ulteriori discussioni.


1373
2017-12-02 02:49



Attenersi encodeURIComponent(). La funzione encodeURI() non si preoccupa di codificare molti caratteri che hanno importanza semantica negli URL (ad esempio "#", "?" e "&"). escape() è deprecato e non si preoccupa di codificare i caratteri "+", che saranno interpretati come spazi codificati sul server (e, come sottolineato da altri qui, non codifica URL-encode caratteri non-ASCII).

C'è un bello spiegazione della differenza tra encodeURI() e encodeURIComponent() altrove. Se vuoi codificare qualcosa in modo che possa essere tranquillamente incluso come componente di un URI (ad es. Come parametro di una stringa di query), vuoi usare encodeURIComponent().


156
2018-05-29 23:54



Personalmente, trovo che molte API vogliano sostituire "" con "+", quindi uso quanto segue:

encodeURIComponent(value).replace(/%20/g,'+');

escape è implementato in modo diverso nei vari browser e encodeURI non codifica la maggior parte dei caratteri che sono funzionali in un URI (come # e anche /) - è fatto per essere usato su un URI / URL completo senza romperlo.

NOTA: Usi encodeURIComponent per il valori della stringa di query (non campi / nomi di valori e sicuramente non l'intero URL). Se lo fai in un altro modo, non codificherà caratteri come =,?, &, Probabilmente lasciando esposta la stringa di query.

Esempio:

const escapedValue = encodeURIComponent(value).replace(/%20/g,'+');
const url = 'http://example.com/?myKey=' + escapedValue;

66
2017-12-15 08:47



Se stai usando jQuery, io andrei a farlo $.param metodo. L'URL codifica un campo di mappatura dell'oggetto su valori, che è più facile da leggere rispetto a chiamare un metodo di escape su ciascun valore.

$.param({a:"1=2", b:"Test 1"}) // gets a=1%3D2&b=Test+1

35
2018-05-13 03:32



Per codificare un URL, come già detto, hai due funzioni:

encodeURI()

e

encodeURIComponent()

Il motivo per cui entrambi esistono è che il primo preserva l'URL con il rischio di lasciare troppe cose senza escape, mentre il secondo codifica tutto ciò che è necessario.

Con il primo, è possibile copiare l'URL appena scappato nella barra degli indirizzi (ad esempio) e funzionerebbe. Tuttavia i tuoi "&" senza caratteri di escape interferirebbero con i delimitatori di campo, i "=" interferirebbero con i nomi e i valori dei campi, ei "+" sembrerebbero spazi. Ma per dati semplici quando si vuole preservare la natura dell'URL di ciò che si sta sfuggendo, questo funziona.

Il secondo è tutto ciò che devi fare per assicurarti che nulla nella tua stringa si intrometta con un URL. Lascia diversi caratteri non importanti senza caratteri in modo che l'URL rimanga il più leggibile possibile dall'uomo senza interferenze. Un URL codificato in questo modo non funzionerà più come URL senza rimuoverlo.

Quindi, se puoi prendere il tempo, vuoi sempre usare encodeURIComponent () - prima di aggiungere coppie nome / valore codifica sia il nome che il valore usando questa funzione prima di aggiungerla alla stringa di query.

Sto passando dei brutti momenti per usare la encodeURI () - lo lascerò alle persone più intelligenti.


8
2018-01-26 21:31



encodeURIComponent () è la strada da percorrere.

var myOtherUrl = "http://example.com/index.html?url=" + encodeURIComponent(myUrl);

MA dovresti tenere presente che ci sono piccole differenze dalla versione di php urlencode () e come citato da @CMS, non codificherà ogni char. Ragazzi a http://phpjs.org/functions/urlencode/ reso js equivalente a 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, '+');
}

7
2017-10-01 08:03



Simile tipo di cosa che ho provato con javascript normale

function fixedEncodeURIComponent(str){
     return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}

4
2018-01-05 18:49



Per evitare la doppia codifica è una buona idea decodificare l'url prima della codifica (se si tratta di url inseriti dall'utente, ad esempio, che potrebbe essere già codificato).

Diciamo che abbiamo abc%20xyz 123 come input (uno spazio è già codificato):

encodeURI("abc%20xyz 123")            //   wrong: "abc%2520xyz%20123"
encodeURI(decodeURI("abc%20xyz 123")) // correct: "abc%20xyz%20123"

3
2018-06-22 03:28



Niente ha funzionato per me. Tutto quello che stavo vedendo era il codice HTML della pagina di login, che tornava al client con il codice 200. (302 inizialmente ma la stessa richiesta Ajax caricava la pagina di login all'interno di un'altra richiesta Ajax, che doveva essere un reindirizzamento piuttosto che il caricamento semplice testo della pagina di accesso).

Nel controller di accesso, ho aggiunto questa riga:

Response.Headers["land"] = "login";

E nel gestore globale Ajax, l'ho fatto:

$(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;
            }
        }
    });
});

Ora non ho alcun problema, e funziona come un fascino.


2
2017-09-10 06:41



Codifica stringa URL

    var url = $ (posizione) .attr ('href'); // ricevi l'url corrente
    //O
    var url = 'folder / index.html? param = # 23dd & noob = yes'; // o specificarne uno

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

1
2017-09-27 15:59