Dateiname mit Sonderzeichen / rawurlencode

Hallo,

ich habe auf dem Webserver eine Datei
Testdokument mit Sönderzeichens!.pdf
liegen.

Wenn ich nun diesen Dateinamen mit rawurlencode() kodiere, dann klappt
folgendes unter Apache 1.3:

Header("Location:
http://webserver/Testdokument%20mit%20S%F6NDER%DFeichens%21. pdf");

Allerdings funktioniert das ganze nicht unter Apache 2.
Dort kommt die Meldung, dass die Datei nicht gefunden wurde.
Gibt es eine Alternative zu rawurlencode()? urlencode() klappt auch
nicht. :-(

Habt ihr ähnliches beobachten können und dafür eine Lösung gefunden?
Ich bin hier am Verzweifeln .... :-( :-(


Grüße

Tino
Tino Korth [ Mi, 25 Juli 2007 10:56 ] [ ID #1778346 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Hi Tino,

Tino Korth schrieb:
> ...
> Header("Location:
> http://webserver/Testdokument%20mit%20S%F6NDER%DFeichens%21. pdf");
>
> Allerdings funktioniert das ganze nicht unter Apache 2.
> Dort kommt die Meldung, dass die Datei nicht gefunden wurde.
> Gibt es eine Alternative zu rawurlencode()? urlencode() klappt auch
> nicht. :-(
>
> Habt ihr ähnliches beobachten können und dafür eine Lösung gefunden?
> Ich bin hier am Verzweifeln .... :-( :-(

ich habe etwas ähnliches gehabt, bei Artikelanlage sollten auch .PDFs
hochgeladen werden. Diese hatten meistens die wildesten Dateinamen mit
Sonderzeichen und Leerzeichen, da diese beim Aufruf Probleme gemacht
haben, habe ich einfach alle entsprechenden Zeichen rausgeschmissen bzw.
die Leerzeichen einfach mit einen _ ersetzt. Denn dann sollte alles
klappen auch dein ReDirect, dann bist du nämlich auf der sicheren Seite.

hth
Stefano

--
business: spicOne multimedia http://www.spicone.de - http://www.spic.de
projects: http://www.mythos77.de - http://www.typopolis.de
private: http://blog.stefano-picco.de - http://spicone.deviantart.com
stefano picco [ Mi, 25 Juli 2007 11:12 ] [ ID #1778347 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Tino Korth schrieb:
> Hallo,
>
> ich habe auf dem Webserver eine Datei
> Testdokument mit Sönderzeichens!.pdf
> liegen.
>
> Wenn ich nun diesen Dateinamen mit rawurlencode() kodiere, dann klappt
> folgendes unter Apache 1.3:
>
> Header("Location:
> http://webserver/Testdokument%20mit%20S%F6NDER%DFeichens%21. pdf");
>
> Allerdings funktioniert das ganze nicht unter Apache 2.
Apache 1 bzw Apache 2 auf dem gleichen Rechner?

Ich würde mal drauf tippen, dass der Apache 2 auf nem anderen Rechner
läuft und dort andere locale settings herrschen so dass dort abgelegte
Dateien kein ö mehr enthalten.

Bitte etwas merh infos:-)

> Dort kommt die Meldung, dass die Datei nicht gefunden wurde.
> Gibt es eine Alternative zu rawurlencode()? urlencode() klappt auch
> nicht. :-(
>
> Habt ihr ähnliches beobachten können und dafür eine Lösung gefunden?
> Ich bin hier am Verzweifeln .... :-( :-(
>
>
> Grüße
>
> Tino
Stefan Braumeister [ Mi, 25 Juli 2007 12:13 ] [ ID #1778349 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Hallo,

stefano picco schrieb:
> ich habe etwas ähnliches gehabt, bei Artikelanlage sollten auch .PDFs
> hochgeladen werden. Diese hatten meistens die wildesten Dateinamen mit
> Sonderzeichen und Leerzeichen, da diese beim Aufruf Probleme gemacht
> haben, habe ich einfach alle entsprechenden Zeichen rausgeschmissen bzw.
> die Leerzeichen einfach mit einen _ ersetzt. Denn dann sollte alles
> klappen auch dein ReDirect, dann bist du nämlich auf der sicheren Seite.

naja, ich würde schon gerne die entsprechenden Zeichen im Namen haben
und sie nicht einfach ersetzen. ;-)

Ich habe mir eine Hilfs-Funktion gebaut:

function txt2esc( $string ) {
$sReturn = "";
$aZeichen = preg_split('#(?<=.)(?=.)#s', $string);
foreach ($aZeichen as $myZeichen) {
print dechex(ord($myZeichen))."<br>";
if (!ereg("(^[a-zA-Z0-9\.])$" , $myZeichen)) {
$sReturn .= "%".strtoupper(dechex(ord($myZeichen)));
} else {
$sReturn .= $myZeichen;
}
}
return $sReturn;
}


Diese ersetzt alle Nicht-Standard-Zeichen durch die entsprechende
Escape-Sequenz.

Auf einer Seite habe ich folgendes gefunden ("Übersetzungstabelle" für
sonderzeichen):
http://www.teialehrbuch.de/Kostenlose-Kurse/Apache/15370-Kod ierungsregeln.html

Nun habe ich meinen Dateinamen "Übernahme 2001.pdf" mithilfe meiner
Funktion in "%DCbernahme%202001.pdf" umgewandelt und ich erhalte
immernoch die Fehlermeldung

-----------------------------
Forbidden

You don't have permission to access /Übernahme 2001.pdf on this server.
Apache/2.0.59 (Win32) Server at 172.30.4.100 Port 81
-----------------------------

Hat sonst noch jemand eine Idee?


:-(


Grüße

Tino
Tino Korth [ Mi, 25 Juli 2007 12:16 ] [ ID #1778350 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Hallo Stefan,

Stefan Braumeister schrieb:
>> Allerdings funktioniert das ganze nicht unter Apache 2.
> Apache 1 bzw Apache 2 auf dem gleichen Rechner?
>
> Ich würde mal drauf tippen, dass der Apache 2 auf nem anderen Rechner
> läuft und dort andere locale settings herrschen so dass dort abgelegte
> Dateien kein ö mehr enthalten.
>
> Bitte etwas merh infos:-)

beiden Apache'a laufen auf einem Server und gucken ins gleiche
htdocs-Verzeichnis.
Der Apache 1.3 läuft auf Port 80, der Apache 2.0 auf Port 81.

Beide haben eine Standard-Konfiguration.

Beim 2'er habe ich schon mit "AddDefaultCharset On" getestet, aber das
bringt auch nix. :-(
http://httpd.apache.org/docs/2.0/mod/core.html#adddefaultcha rset


Grüße

Tino
Tino Korth [ Mi, 25 Juli 2007 12:19 ] [ ID #1778351 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Tino Korth schrieb:

> Nun habe ich meinen Dateinamen "Übernahme 2001.pdf" mithilfe meiner
> Funktion in "%DCbernahme%202001.pdf" umgewandelt und ich erhalte immernoch
> die Fehlermeldung
>
> -----------------------------
> Forbidden
>
> You don't have permission to access /Übernahme 2001.pdf on this server.
> Apache/2.0.59 (Win32) Server at 172.30.4.100 Port 81
> -----------------------------
>
> Hat sonst noch jemand eine Idee?

Wenn der Server unter Windows läuft, oder einem anderen OS mit UTF-8 im
Dateisytem, musst du den Dateinamen/Pfad erst mit utf8_encode() nach UTF-8
konververtieren und kannst dann das Ergebnis mit rawurlencode() behandeln,
dessen Ergebnis du dann in deinen HTML Links benutzen kannst.

Gruß
Carsten
Carsten Wiedmann [ Mi, 25 Juli 2007 12:29 ] [ ID #1778352 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Hi Tino,

Tino Korth schrieb:
> ...
> Auf einer Seite habe ich folgendes gefunden ("Übersetzungstabelle" für
> sonderzeichen):
> http://www.teialehrbuch.de/Kostenlose-Kurse/Apache/15370-Kod ierungsregeln.html

direkt mal bookmarken, der Link ist hilfreich!

> Nun habe ich meinen Dateinamen "Übernahme 2001.pdf" mithilfe meiner
> Funktion in "%DCbernahme%202001.pdf" umgewandelt und ich erhalte
> immernoch die Fehlermeldung

Was generell das technische Problem angeht kann ich dir leider auch
nicht weiterhelfen. Doch was spricht geben "uebernahme_2001.pdf"? Da
würde sich auch jede Suchmaschine bzw. ihre Spider drüber freuen glaube
ich, falls solche Links öffentlich zugänglich sind.

bye
Stefano

--
business: spicOne multimedia http://www.spicone.de - http://www.spic.de
projects: http://www.mythos77.de - http://www.typopolis.de
private: http://blog.stefano-picco.de - http://spicone.deviantart.com
stefano picco [ Mi, 25 Juli 2007 12:33 ] [ ID #1778353 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Hallo Carsten,

>> Hat sonst noch jemand eine Idee?
>
> Wenn der Server unter Windows läuft, oder einem anderen OS mit UTF-8 im
> Dateisytem, musst du den Dateinamen/Pfad erst mit utf8_encode() nach
> UTF-8 konververtieren und kannst dann das Ergebnis mit rawurlencode()
> behandeln, dessen Ergebnis du dann in deinen HTML Links benutzen kannst.

leider funktioniert das nur beim Apache 2.


Apache 1 meldet:

------------------------
Not Found
The requested URL /ýbernahme 2001.pdf was not found on this server.

Apache/1.3.37 Server at erde Port 80
------------------------


Grüße

Tino
Tino Korth [ Mi, 25 Juli 2007 12:44 ] [ ID #1778354 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Tino Korth schrieb:
> Hallo Stefan,
>
> Stefan Braumeister schrieb:
>>> Allerdings funktioniert das ganze nicht unter Apache 2.
>> Apache 1 bzw Apache 2 auf dem gleichen Rechner?
>>
>> Ich würde mal drauf tippen, dass der Apache 2 auf nem anderen Rechner
>> läuft und dort andere locale settings herrschen so dass dort abgelegte
>> Dateien kein ö mehr enthalten.
>>
>> Bitte etwas merh infos:-)
>
> beiden Apache'a laufen auf einem Server und gucken ins gleiche
> htdocs-Verzeichnis.
> Der Apache 1.3 läuft auf Port 80, der Apache 2.0 auf Port 81.

Windows oder Linux?

Hast du das abgetippt:

>>Testdokument mit Sönderzeichens!.pdf
>>Header("Location:
>>http://webserver/Testdokument%20mit%20S%F6NDER%DFeichens%2 1.pdf");

denn das stimmt ja eh nicht. Groß/Kleinschreibung unter Linux, bzw das
codierte z


Wenn Linux, dann lass dir mal via php die Ausgabe des shell Kommandos:

locale


unter Apache1 und Apache2 ausgeben.

>
> Beide haben eine Standard-Konfiguration.
>
> Beim 2'er habe ich schon mit "AddDefaultCharset On" getestet, aber das
> bringt auch nix. :-(
> http://httpd.apache.org/docs/2.0/mod/core.html#adddefaultcha rset

Nö das ist ja nur für die Ausgabe auf der Clientseite.
Aber wenns unter Windows ist, dann wüsste ich jetzt nicht wo das Problem
noch liegen könnte.


>
>
> Grüße
>
> Tino
Stefan Braumeister [ Mi, 25 Juli 2007 13:37 ] [ ID #1778358 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Carsten Wiedmann schrieb:
> Tino Korth schrieb:
>
>> Nun habe ich meinen Dateinamen "Übernahme 2001.pdf" mithilfe meiner
>> Funktion in "%DCbernahme%202001.pdf" umgewandelt und ich erhalte
>> immernoch die Fehlermeldung
>>
>> -----------------------------
>> Forbidden
>>
>> You don't have permission to access /Übernahme 2001.pdf on this server.
>> Apache/2.0.59 (Win32) Server at 172.30.4.100 Port 81
>> -----------------------------
>>
>> Hat sonst noch jemand eine Idee?
>
> Wenn der Server unter Windows läuft, oder einem anderen OS mit UTF-8 im
> Dateisytem, musst du den Dateinamen/Pfad erst mit utf8_encode() nach

NTFS nutzt aber unicode:-)

> UTF-8 konververtieren und kannst dann das Ergebnis mit rawurlencode()
> behandeln, dessen Ergebnis du dann in deinen HTML Links benutzen kannst.
>
> Gruß
> Carsten
>
Stefan Braumeister [ Mi, 25 Juli 2007 14:09 ] [ ID #1778360 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Tino Korth schrieb:
> Hallo Carsten,
>
>>> Hat sonst noch jemand eine Idee?
>>
>> Wenn der Server unter Windows läuft, oder einem anderen OS mit UTF-8
>> im Dateisytem, musst du den Dateinamen/Pfad erst mit utf8_encode()
>> nach UTF-8 konververtieren und kannst dann das Ergebnis mit
>> rawurlencode() behandeln, dessen Ergebnis du dann in deinen HTML Links
>> benutzen kannst.
>
> leider funktioniert das nur beim Apache 2.
>
>
> Apache 1 meldet:
>
> ------------------------
> Not Found
> The requested URL /ýbernahme 2001.pdf was not found on this server.

1.2.11 Native Windows NT Unicode-Unterstützung
Unter Windows NT-basierten Versionen des Windows-Betriebssystems verwendet
der Apache 2.0 jetzt utf-8 für alle Dateinamen-Kodierungen. Diese werden
direkt
auf das zugrunde liegende Unicode-Dateisystem abgebildet, wodurch
Mehrsprach-
Unterstützung für alle Windows NT-basierten Varianten (Windows 2000,
NT, XP) möglich wird. Unter Windows 95, 98 oder ME ist diese nicht
verfügbar,
so dass hier die lokale Codepage des jeweiligen Rechners für den Zugriff
auf das
Dateisystem verwendet wird.

Von daher wird dir nix anderes bleiben als hier nen hack zu
programmieren, für jede Apacheversion.

>
> Apache/1.3.37 Server at erde Port 80
> ------------------------
>
>
> Grüße
>
> Tino
Stefan Braumeister [ Mi, 25 Juli 2007 14:23 ] [ ID #1778361 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Hallo Stefan,

Stefan Braumeister schrieb:

> Von daher wird dir nix anderes bleiben als hier nen hack zu
> programmieren, für jede Apacheversion.

Yupp, sowas hatten wir vorher auch gemacht:

-----------------------------------
list ($sSoftware, $sVersion) = split("/", $_SERVER["SERVER_SOFTWARE"]);
list ($sVersion, $sTmp) = split(" ", $sVersion);
list ($sMainVersion, $sSubVersion, $sBuilt) = split(".", $sVersion);
if ($sMainVersion == 1) {
$sDocument = "http://webserver/".urlencode($dest_name);
} else {
$sDocument = "http://webserver/".rawurlencode(utf8_encode($dest_name));
}
-----------------------------------
[Jaaaa, mit preg bekommt man das bestimmt schöner hin! ;-P]


Ich hatte nur gehofft, dass es eine "bessere nicht-special" Variante
gibt. ;)

Danke für die Antworten! :-)


Grüße

Tino
Tino Korth [ Mi, 25 Juli 2007 20:11 ] [ ID #1778383 ]

Re: Dateiname mit Sonderzeichen / rawurlencode

Tino Korth schrieb:

> > Wenn der Server unter Windows läuft, oder einem anderen OS mit UTF-8 im
> > Dateisytem, musst du den Dateinamen/Pfad erst mit utf8_encode() nach
> > UTF-8 konververtieren und kannst dann das Ergebnis mit rawurlencode()
> > behandeln, dessen Ergebnis du dann in deinen HTML Links benutzen kannst.
>
> leider funktioniert das nur beim Apache 2.
>
>
> Apache 1 meldet:

Da sieht man mal, dass ich mit dem Apache 1 noch nie wirklich was gemacht
habe...


> Ich hatte nur gehofft, dass es eine "bessere nicht-special" Variante gibt.
> ;)

Das IMHO einzig Ideale, wenn man Dateien mit Sonderzeichen hat (und
natürlich wenn man DAV benutzt), ist das Installieren von mod_encoding. Ein
kurzer Test hat jedenfalls gerade gezeigt, dass dann auch der Request von
"Umlautdateien" mit dem Apache 1.3.37 ohne Probleme funktioniert.

Gruß
Carsten
Carsten Wiedmann [ Do, 26 Juli 2007 09:36 ] [ ID #1779344 ]
PHP » de.comp.lang.php.misc » Dateiname mit Sonderzeichen / rawurlencode

Vorheriges Thema: Problem mit dateizugriffen
Nächstes Thema: Phing oder lieber Ant oder was anderes