Seite 1 von 1

punkt in query-string

Verfasst: 26.09.2012, 11:53
von umwelt
Hallo,
ich habe folgendes Problem:

eine Seite wird mit mod_rewrite optimiert... QSA als flag.

rufe ich die seite mit seite1.html auf, wird auf index.php?id=1 verwiesen.

auch seite1.html?var=bla ruft index.php?id=1 auf und übergibt zudem "var" per GET.

wenn ich aber seite1.html?var=bla.bla aufrufe, kommt ein 404. Der Punkt scheint der Auslöser zu sein.

Jemand eine idee, wie ich das löse?

Verfasst:
von

Verfasst: 26.09.2012, 12:11
von umwelt
hatte gelogen :)

(.*).html wird an bla.php weitergeleitet, das den aufruf-pfad zerlegt und intern verarbeitet.

pathinfo() trennt beim punkt den dateinamen von der endung. wenn also ein punkt in der query erscheint, wird erst da getrennt.

mit explode und array[0] bekommt man also den ersten teil des "dateinamens" raus.
ist ein punkt eigentlich in einer URL gültig, oder setzt sich facebook da übers standards hinweg?

Re: punkt in query-string

Verfasst: 26.09.2012, 13:11
von Melegrian
umwelt hat geschrieben:wenn ich aber seite1.html?var=bla.bla aufrufe,
umwelt hat geschrieben:ist ein punkt eigentlich in einer URL gültig, oder setzt sich facebook da übers standards hinweg?
Der Punkt bezieht sich nicht auf die Gliederung der URL, sondern gehört zum Wert.

Parameter1 = Wert1&Parameter2 = Wert2

Wüsste jetzt nicht, was dagegen sprechen sollte, wenn der Wert zum Beispiel die Zahl 251.56 enthält. Vielleicht sollte man den Punkt escapen? Ein Punkt hat mich bisher noch nicht gestört, müsste man mal testen.

Für PHP: rawurlencode() Doch der Punkt gehört doch da wohl nicht zu, denke ich und so steht es doch auch geschrieben.
Diese Kodierung, …, wurde entworfen, um Sonderzeichen davor zu bewahren, fälschlich als spezielle URL-Trennzeichen interpretiert zu werden,..
https://php.net/manual/de/function.rawurlencode.php

Oder für JavaScript: encodeURI()

https://de.selfhtml.org/javascript/obje ... encode_uri

Verfasst: 26.09.2012, 13:22
von umwelt
is mir schon klar, dass der zum parameter-wert gehört.
bloß: php erkennt dann offenbar nicht, wo der dateiname endet... pathinfo() mit einer solchen url

Code: Alles auswählen

blablba.html?bla=blubb&bleb=blagleichkommteinpunkt.blubbdiblei
ergibt

Code: Alles auswählen

blablba.html?bla=blubb&bleb=blagleichkommteinpunkt
als dateiname.
damit kann man intern natürlich nicht ohne weiteres vorgehen

dat is ja nich sinn der sache... deshalb fragte ich mich, wo der fehler liegt.

edit, hier steht was dazu: https://php.net/manual/en/function.pathinfo.php#88654

Verfasst: 26.09.2012, 13:37
von Melegrian
Na ja, erst mit strpos nach einem Fragezeichen zu suchen, weil mit pathinfo das Fragezeichen nicht erkannt wird, wenn in einem Wert vom QueryString noch ein Punkt vorkommt, erscheint mir auch recht umständlich. Vielleicht sollte man den dann doch lieber irgendwie maskieren.

Verfasst: 26.09.2012, 13:41
von umwelt
hallo,
ich habe das bei einem link von facebook bemerkt. aus irgendeinem grund waren da viele variablen enthalten, u. a. mit punkt im wert. da ist mir aufgefallen, dass ich trotz korrektem mod_rewrite einen 404 erhalte, wenn ich die Query nicht entferne bzw. den Punkt aus dem wert entferne.

Verfasst: 26.09.2012, 14:40
von Melegrian
Ja, ist ja interessant, basename bleibt aber extension und filename sind bei was2 nicht mehr zu gebrauchen. Wenn ich statt dem Punkt %2E verwende, entspricht was3 wieder was1. Also, eventuell Punkte im QueryString vorher umwandeln, sollte zumindest einen Test wert sein.

Code: Alles auswählen

<?php

$was1 = pathinfo&#40;"http&#58;//localhost/a.php?para=251"&#41;;
$was2 = pathinfo&#40;"http&#58;//localhost/a.php?para=251.56"&#41;;
$was3 = pathinfo&#40;"http&#58;//localhost/a.php?para=251%2E56"&#41;;  // Punkt gleich %2E

echo "<pre>\n";
print_r&#40;$was1&#41;;
print_r&#40;$was2&#41;;
print_r&#40;$was3&#41;;
echo "</pre>\n";

/*
Ausgabe was1&#58;

Array
&#40;
    &#91;dirname&#93; => http&#58;//localhost
    &#91;basename&#93; => a.php?para=251
    &#91;extension&#93; => php?para=251
    &#91;filename&#93; => a
&#41;
Ausgabe was2&#58;

Array
&#40;
    &#91;dirname&#93; => http&#58;//localhost
    &#91;basename&#93; => a.php?para=251.56
    &#91;extension&#93; => 56
    &#91;filename&#93; => a.php?para=251
&#41;
Ausgabe was3&#58;

Array
&#40;
    &#91;dirname&#93; => http&#58;//localhost
    &#91;basename&#93; => a.php?para=251%2E56
    &#91;extension&#93; => php?para=251%2E56
    &#91;filename&#93; => a
&#41;
*/
?>

Verfasst: 26.09.2012, 17:21
von umwelt
hmm, jo. glaubst du, explode() ist rechenaufwändiger als str_replace bzw urlencode()?

Verfasst: 26.09.2012, 20:57
von Melegrian
Nein, wie es am einfachsten geht. Wenn es mit explode() einfacher zu handhaben ist, warum nicht.