utf8 - javascript rawurlencode




URL in JavaScript kodieren? (9)

Wie verschlüsseln Sie eine URL mit JavaScript so, dass sie in eine GET-Zeichenfolge eingefügt werden kann?

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

Ich myUrl davon aus, dass Sie die myUrl Variable in dieser zweiten Zeile codieren myUrl .


Was ist URL-Codierung:

Eine URL sollte codiert werden, wenn sich Sonderzeichen in der URL befinden. Zum Beispiel:

console.log(encodeURIComponent('?notEncoded=&+'));

In diesem Beispiel können wir feststellen, dass alle Zeichen außer der Zeichenfolge notEncoded mit% -Zeichen codiert sind. Die URL-Codierung wird auch als prozentuale Codierung bezeichnet, da alle Sonderzeichen mit einem% gekennzeichnet werden. Nach diesem% -Zeichen hat jedes Sonderzeichen einen eindeutigen Code

Warum brauchen wir eine URL-Codierung:

Bestimmte Zeichen haben einen besonderen Wert in einer URL-Zeichenfolge. Zum Beispiel das? Zeichen bezeichnet den Anfang einer Abfragezeichenfolge. Um eine Ressource erfolgreich im Web zu lokalisieren, muss unterschieden werden, wann ein Zeichen als Teil einer Zeichenfolge oder Teil der URL-Struktur gemeint ist.

Wie erreichen wir eine URL-Kodierung in JS:

JS bietet eine Reihe von eingebauten Utility-Funktionen, mit denen wir URLs einfach kodieren können. Dies sind zwei praktische Optionen:

  1. encodeURIComponent() : encodeURIComponent() eine Komponente eines URI als Argument und gibt den codierten URI-String zurück.
  2. encodeURI() : encodeURI() einen URI als Argument und gibt den codierten URI-String zurück.

Beispiel und Vorbehalte:

encodeURIComponent() die gesamte URL (einschließlich Schema, z. B. https: //) nicht an encodeURIComponent() . Dies kann tatsächlich in eine nicht funktionale URL umgewandelt werden. Zum Beispiel:

// for a whole URI don't use encodeURIComponent it will transform
// the / characters and the URL won't fucntion properly
console.log(encodeURIComponent("http://www.random.com/specials&char.html"));

// instead use encodeURI for whole URL's
console.log(encodeURI("http://www.random.com/specials&char.html"));

Wir können beobachten, wie wir die gesamte URL in encodeURIComponent dass die Schrägstriche (/) des Vorwärtsbereichs ebenfalls in Sonderzeichen konvertiert werden. Dadurch funktioniert die URL nicht mehr richtig.

Verwenden Sie daher (wie der Name schon sagt):

  1. encodeURIComponent in einem bestimmten Teil einer URL, die Sie kodieren möchten.
  2. encodeURI für eine ganze URL, die Sie codieren möchten.

Ähnliches habe ich mit normalem Javascript versucht

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

Ich persönlich finde, dass viele APIs "" durch "+" ersetzen möchten, also verwende ich Folgendes:

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

escape ist in verschiedenen Browsern unterschiedlich implementiert, und encodeURI codiert nicht die meisten Zeichen, die in einem URI funktionieren (wie # und sogar /). Es wurde für die Verwendung mit einem vollständigen URI / einer URL entwickelt, ohne dass es beschädigt wird.

HINWEIS : Sie verwenden encodeURIComponent für die Werte in der Abfragezeichenfolge (nicht Felder / Wertnamen und definitiv nicht die gesamte URL). Wenn Sie dies auf eine andere Weise tun, werden keine Zeichen wie =,?, & Codiert, wodurch die Abfragezeichenfolge möglicherweise ausgesetzt bleibt.

Beispiel:

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

Nichts hat für mich funktioniert. Alles, was ich sah, war der HTML-Code der Anmeldeseite, der mit Code 200 auf die Clientseite zurückkehrte. (302 zuerst, aber die gleiche Ajax-Anforderung lädt die Anmeldeseite in eine andere Ajax-Anforderung, die eher eine Weiterleitung als ein einfaches Laden sein sollte Text der Anmeldeseite).

Im Login-Controller habe ich folgende Zeile hinzugefügt:

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

Und im globalen Ajax-Handler habe ich Folgendes getan:

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

Jetzt habe ich kein Problem mehr und es wirkt wie ein Zauber.


Sie können die esapi-Bibliothek verwenden und Ihre URL mithilfe der folgenden Funktion kodieren. Die Funktion bleibt bestehen, wenn '/' nicht verschlüsselt wird, während der Rest des Textinhalts codiert wird:

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;
}

https://www.owasp.org/index.php/ESAPI_JavaScript_Readme


Um Doppelcodierung zu verhindern, empfiehlt es sich, die URL vor der Codierung zu decodieren (wenn Sie beispielsweise mit vom Benutzer eingegebenen URLs arbeiten, die möglicherweise bereits codiert sind).

abc%20xyz 123 wir an, wir haben abc%20xyz 123 als Eingabe (ein Leerzeichen ist bereits codiert):

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

Wenn Sie jQuery verwenden, würde ich für die $.param Methode gehen. Die URL codiert ein Objekt, das Felder mit Werten abbildet. Dies ist einfacher zu lesen als das Aufrufen einer Escape-Methode für jeden Wert.

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

encodeURIComponent () ist der Weg zu gehen.

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

ABER Sie sollten bedenken, dass es kleine Unterschiede zu PHP-Version urlencode() und wie @CMS erwähnt, werden nicht alle Zeichen codiert. Jungs unter http://phpjs.org/functions/urlencode/ machten js äquivalent zu 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, '+');
}

URL-Zeichenfolge kodieren

    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






encoding