Zur Navigation

$_FILES nach Upload auf VirtualHost leer

1 Rudy

Hallo,

ich hoffe mir kann jemand hier das Verhalten des PHP-Uploads bei meinem lokalen Apache VirtualHost erklären (Apache2, PHP5). Wenn ich z.B. folgendes Testskript im Unterverzeichnis /cms/ laufen lasse:

test.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
   <head>
      <title>Uploadtest</title>
   </head>
   <body>
      <form enctype="multipart/form-data" action="test.php" method="post">
         <input name="userfile[]" type="file"><br />
         <input name="userfile[]" type="file"><br />
         <input type="submit" value="Senden">
      </form>
   </body>
</html>

test.php
<pre>
   <?php
      print_r($_FILES);
   ?>
</pre>

Dann ist die Ausgabe immer nur Array() - also $_FILES ist leer. Wenn ich im Action aber action="http://local.domain.it/cms/test.php" angebe, funktioniert der Upload, $_FILES ist gefüllt. Warum ist das so?

Meine VHost-Datei für local.domain.it:

<VirtualHost *>
  ServerName local.domain.it
  ServerAdmin webmaster@local.domain.it
  DocumentRoot /var/www/public/local.domain.it/
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  <Directory /var/www/public/local.domain.it/>
    Options -Indexes ExecCGI FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
  ErrorLog /var/www/public/local.domain.it/apache-error.log
  LogLevel warn
  CustomLog /var/www/public/local.domain.it/apache-access.log combined
  ServerSignature On
</VirtualHost>

In der Domainroot funktioniert das Skript wie erwartet, auch ohne Angabe der Domain im action.

In der Domainroot liegt eine .htaccess:

RewriteEngine on
RewriteRule ^$ http://local.domain.it/band.html [R=301,L]
RewriteRule ^(news|band|downloads|livegigs|gallery|links|guestbook)\.html$ index.php?module=$1&page=1&language=de
RewriteRule ^(news|downloads|livegigs|gallery|links)\-p([2-9]|[1-9][0-9]+)\.html$ index.php?module=$1&page=$2
RewriteRule ^(guestbook)\-p([1-9]|[1-9][0-9]+)\.html$ index.php?module=$1&page=$2&detail=1
RewriteRule ^(news|downloads|livegigs)\/([A-Za-z0-9\-_]+)\-p([0-9]+)\.html$ index.php?module=$1&detail=$2&page=$3
RewriteRule ^(news|downloads|livegigs)\/([A-Za-z0-9\-_]+)\.html$ index.php?module=$1&detail=$2&page=1

und eine im Unterverzeichnis /cms/:

RewriteEngine on
RewriteBase /cms/
RewriteRule ^$ http://local.domain.it/cms/main.html [R=301,L]
RewriteRule ^(main|gallery)\.html$ index.php?module=$1&action=view
RewriteRule ^(gallery)-(edit|upload|pictures)-([1-9]|[1-9][0-9]+)\.html$ index.php?module=$1&action=$2&id=$3 [QSA]
#RewriteRule ^(gallery)\/(edit|upload|pictures)-([1-9]|[1-9][0-9]+)\.html$ index.php?module=$1&action=$2&id=$3 [QSA]
RewriteRule ^(gallery)-(new)\.html$ index.php?module=$1&action=$2

Habe ich da irgendwo eine Einstellung, die dieses doch eher merkwürdige Verhalten verursacht? Ein Fehlverhalten durch die zwei .htaccess?

Das ist leider nicht das einzige Problem... ^^ Die auskommentierte Zeile in der .htaccess von /cms/ wäre eigentlich gewollt - als z.B. die URL local.domain.it/cms/gallery/upload-1.html. Funktioniert aber nicht - der Fehlercode ist 404 not found. Deshalb musste ich einen Bindestrich nehmen und es zu local.domain.it/cms/gallery-upload-1.html machen - das funktioniert. Warum? Ich kann im regulären Ausdruck keinen Fehler entdecken...

19.08.2007 23:28 | geändert: 19.08.2007 23:36

2 Jörg Kruse

Hallo Rudy,

warum der Array bei action="test.php" leer ist, bei action="http://local.domain.it/cms/test.php" aber nicht, finde ich auch etwas merkwürdig - denn eigentlich sollte der Browser in beiden Fällen dieselbe Anfrage an den Server stellen? Ist nach dem Post die URL in der Adresszeile denn in beiden Fällen identisch?

Zur auskommentierten RewriteRule:
Ich denke, ein Slash muss nicht escapet werden - versuche es mal ohne Backslash an der Stelle:
RewriteRule ^(gallery)/(edit|upload|pictures)-([1-9]|[1-9][0-9]+)\.html$ index.php?module=$1&action=$2&id=$3 [QSA]

19.08.2007 23:47

3 Rudy

Ok, ich hab keine Ahnung was da los war, aber ich hab den Upload in Opera und Konqueror getestet, und es funktionierte in beiden Versionen. Auch auf die überschriebene URL (mein eigentliches Ziel) /cms/gallery-upload-1.html. Firefox hat rumgesponnen... das hab ich bemerkt, als das test.html mit Ziel 'test.php' plötzlich funktionierte. Ich hab dann auf der überschriebenen URL den Upload gestet, $_FILES leer. Dann nochmal dasselbe (!) test.html getestet, und $_FILES wieder leer. Dann habe ich hab ihn geschlossen und neu geöffnet, dann gings. Na ja, der läuft bei mir auch manchmal tageweise :) Aber sowas dürfte trotzdem nicht passieren oO - ich ärger mich da zu Tode... hoffentlich macht er das nicht nochmal. Stumpfsinn - siehe Post 6

Zwecks RewriteRule: Die weigert sich standhaft, wenn ich ein Unterverzeichnis will (auch in anderen Browsern - ich weiß, dürfte nichts zu sagen haben, aber trotzdem, nach dem heute ^^)

Die htaccess in /cms/ sieht jetzt so aus:
RewriteEngine on
RewriteRule ^$ http://local.domain.it/cms/main.html [R=301,L]
RewriteRule ^(main|gallery)\.html$ index.php?module=$1&action=view
RewriteRule ^(gallery)-(edit|upload|pictures)-([1-9][0-9]*)\.html$ index.php?module=$1&action=$2&id=$3 [QSA]
RewriteRule ^(gallery)/(edit|upload|pictures)-([1-9][0-9]*)\.html$ index.php?module=$1&action=$2&id=$3 [QSA]
RewriteRule ^(gallery)-(new)\.html$ index.php?module=$1&action=$2
Ich hab die betroffene Rule in der .htaccess der Root getestet - funktioniert (local.domain.it/gallery/upload-1.html - so mag ichs aber nicht :))

Für heute lass ichs jedenfalls, ich muss morgen wieder früh raus. Dank Dir!

20.08.2007 01:58 | geändert: 20.08.2007 20:47

4 Jörg Kruse

Vielleicht pfuscht die Option MultiViews im Zusammenhang mit der zweiten RewriteRule hier rein, also dass der Server hier mit gallery.html und gallery/ durcheinander kommt. Ich würde dann folgendes mal austesten:

- die RewriteRule für /cms/gallery/upload-1.html vor die Rule für /cms/gallery.html schieben. Gegebenenfalls noch mit einem [L] Flag versehen

RewriteEngine on
RewriteBase /csm/
RewriteRule ^$ http://local.domain.it/cms/main.html [R=301,L]
RewriteRule ^(gallery)/(edit|upload|pictures)-([1-9][0-9]*)\.html$ index.php?module=$1&action=$2&id=$3 [L,QSA]
RewriteRule ^(main|gallery)\.html$ index.php?module=$1&action=view
RewriteRule ^(gallery)-(edit|upload|pictures)-([1-9][0-9]*)\.html$ index.php?module=$1&action=$2&id=$3 [QSA]
RewriteRule ^(gallery)-(new)\.html$ index.php?module=$1&action=$2

Falls das nicht hilft, es mit einem anderem Verzeichnisnamen versuchen, z.B. /cms/test/upload-1.html. Falls es dann funktioniert, wurde das Problem wohl durch MultiViews verursacht.

20.08.2007 08:47 | geändert: 20.08.2007 08:49

5 Rudy

Die .htaccess hat so nicht funktioniert - ich habe Multiviews abgeschaltet, jetzt gehts. Zum Teufel mit der Option, die brauch ich gar nicht.

Danke - wieder mal ;)

20.08.2007 19:02

6 Rudy

uiuiui... jetzt weiß ich den Grund für das leere $_FILES. Die Sache ist die... ich habe falsch getestet. Und zwar versuche ich zip-Files mit jpg-Dateien hochzuladen, um diese dann in der Galerie zu entpacken. Dafür habe ich zwei in einem Ordner - eines mit 10MB und eines mit 7MB. Beim Testen habe ich immer zufällig eines genommen, und das war fatal.

Für den Upload habe ich die Einstellungen in PHP.ini vorgenommen, genau so wie sie mein Hoster hat.

file_uploads: On 
upload_max_filesize: 50M 
upload_tmp_dir: /tmp/ 
max_input_time: -1
memory_limit: 12M
max_execution_time: 120
post_max_size: 8M

Und post_max_size ist natürlich zu klein. Poste ich nun mehr, ist $_FILES einfach leer, keine Fehlermeldung.

Ich verstehe die PHP-Einstellungen von meinem Hoster nicht... was bringt es, upload_max_filesize auf 50M zu setzen, wenn ich doch nur 8M posten kann? Und das innerhalb von 120s ist auch kaum zu bewerkstelligen. Wenn ich post_max_size bei mir lokal auf 50M stelle (was ja Sinn macht), funktioniert der Upload immer. Natürlich geht das lokal viel schneller von Statten als online.

Zum Glück (dieses Mal) hat mein Hoster den Safe-Mode aus, so kann ich den Timeout vielleicht hochschrauben und post_max_size vergrößern. Mal schauen, ob ich das mit

php_value max_execution_time 3600
php_value post_max_size 50M

in der .htaccess aushebeln kann.

20.08.2007 21:09 | geändert: 20.08.2007 21:30

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]