3 Stimmen

Jquery, ajax und das Und-Zeichen-Rätsel

Ich weiß, dass ich sollte encodeURI jede Url an etwas anderes übergeben, weil ich dies lesen: http://www.digitalbart.com/jquery-and-urlencode/

Ich möchte die aktuelle Zeit des Titels, den ich gerade höre, weitergeben. Also habe ich den hervorragenden yoururls shortener installiert. Und ich habe ein bisschen Code, der alle Bits zusammenfügt und das Folgende macht: track=2&time=967

Da ich nicht möchte, dass jeder meinen privaten Schlüssel sehen kann, habe ich eine kleine php-Datei, die die Eingaben entgegennimmt und das Folgende anfügt, so dass es wie folgt aussieht: http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=http://urltoshorten?track=2&time=967

Auf der Hauptseite rufe ich also das jquery von $("div.shorturl").load(loadall);

Es tut dann ein wenig von CURL und dann shortener gibt eine schöne kurze URL.

Zum Beispiel so:

$myurl='http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=' . $theurl;
$ch = curl_init($myurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
  echo 'cURL failed';
  exit;
}
echo $data;

Alles perfekt.

Außer... die URL, die gekürzt wird, hat immer die Form http://urltoshorten?track=2 - alles nach dem kaufmännischen Und-Zeichen wird gekürzt.

Ich habe versucht, die gesamte URL in php's URLencode einzuschließen, ich habe track=2&time=967 sowohl in encodeURI als auch in encodeURIComponent eingeschlossen, ich habe sogar versucht, die ganze Sache in eine oder beide einzuschließen. Und trotzdem bricht das & ab, obwohl ich sehen kann, dass die übermittelte URL am Ende wie track=1%26time%3D5 aussieht.

Wenn ich diese oder sogar die "einfache" Version mit der unverschlüsselten URL entweder in die yoururls-Benutzeroberfläche einfüge oder sie über die API als normale URL, die in die Adressleiste des Browsers eingefügt wird, an yoururls übermittle, funktioniert es wieder perfekt.

Es ist also nicht yoururls Schuld, es scheint, wie die URL richtig kodiert wird, das einzige, was ich denken kann, ist CURL möglicherweise?

An dieser Stelle werden Sie vielleicht denken: "Warum nicht das & durch ein * ersetzen und dann wieder zurück konvertieren? OK, also wenn die URL erweitert wird, erhalte ich die Werte von

var track = $.getUrlVar('track');
var time = $.getUrlVar('time');

Ich KÖNNTE also die Zeitvariante verlieren, dann ein bisschen suchen, wo das * in der Spur ist, und dann davon ausgehen, dass der Rest von allem nach * die Zeit ist, aber das ist ein bisschen hässlich, und mehr auf den Punkt, es ist nicht wirklich der richtige Weg, Dinge zu tun.

Wenn mir jemand helfen könnte, wäre ich sehr dankbar.

2voto

bobince Punkte 512550

Ich habe versucht, die gesamte URL in den URLencode von php einzuschließen

Das ist in der Tat das, was Sie tun müssen (vorausgesetzt, Sie meinen mit "URL" die innere URL, die als Komponente der äußeren URL übergeben wird). Jedes Mal, wenn Sie einen Wert in eine URL-Komponente setzen, müssen Sie URL-codieren, ob der Wert, den Sie einstellen, eine URL ist oder nicht.

$myurl='http://...?...&url='.rawurlencode($theurl);

( urlencode() ist für Abfrageparameter wie diesen OK, aber rawurlencode() ist auch für Pfadteile in Ordnung. Wenn Sie also nicht wirklich brauchen, dass die Leerzeichen etwas hübscher aussehen, sollten Sie [ + gegen %20 ], würde ich mich für rawurlencode() standardmäßig).

Dadurch erhalten Sie eine endgültige URL wie:

http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=http%3A%2F%2Furltoshorten%3Ftrack%3D2%26time%3D967

Sie sollten in der Lage sein zu überprüfen, ob das funktioniert. Wenn nicht, stimmt etwas nicht mit yourls-api.php .

1voto

Incognito Punkte 19941

Ich habe versucht, die gesamte URL in php's URLencode einzuschließen, ich habe track=2&time=967 sowohl in encodeURI als auch in encodeURIComponent eingeschlossen, ich habe sogar versucht, die ganze Sache in eine oder beide einzuschließen. Und trotzdem bricht das & ab, obwohl ich sehen kann, dass die übermittelte URL am Ende wie track=1%26time%3D5 aussieht.

Vielleicht hilft Ihnen eine Erklärung, wie HTTP-Variablen funktionieren.

Wenn ich eine Seite mit den folgenden Variablen und Werten erhalte:

var1 = Bruce Oxford
var2 = Brandy&Wine
var3 =             (unicode chars)

Wir kodieren den Vari-Namen und den Wert der Variable uri-kodieren, d.h.:

var1 = Bruce+Oxford
var2 = Brandy%26Wine
var3 = %E2%9E%8B%E2%9E%8C%E2%9E%94

Was wir nicht tun, ist die Kodierung der abgrenzenden Akteure, so dass die Anfragedaten für die oben genannten aussehen werden:

?var1=Bruce+Oxford&var2=Brandy%26Wine&var3=%E2%9E%8B%E2%9E%8C%E2%9E%94

Anstatt:

%3Fvar1%3DBruce+Oxford%26var2%3DBrandy%26Wine%26var3%3D%E2%9E%8B%E2%9E%8C%E2%9E%94

Was natürlich nur Kauderwelsch ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X