2016-03-26 7 views
2

Ich möchte große Dateiuploads an einen einzigen Speicherort aktivieren, und dieser Speicherort wird dann an einen anderen Speicherort umgeschrieben. Es scheint, dass das Neuschreiben die anderen Konfigurationen zurücksetzt.Wie kann ich rewrite und client_max_body_size in nginx kombinieren?

Meine Config:

server { 
    listen 80; 

    server_name example.com; 
    root /var/www; 
    index index.php; 

    # this location requires large file upload 
    location /upload { 
     client_max_body_size 512M; 
     rewrite ^(.*)$ /index.php?request=$1 last; 
    } 

    # all other locations 
    location/{ 
     rewrite ^(.*)$ /index.php?request=$1 last; 
    } 

    # pass the PHP scripts to FPM 
    location ~ \.php$ { 
     include /etc/nginx/includes/php; 
    } 
} 

Wenn ich die client_max_body_size aus dem location und in die server bewegen, dann funktioniert es. Wenn ich es sowohl in die UND location ~ \.php$, dann funktioniert es auch. Ich möchte jedoch nicht, dass andere Standorte große Dateien hochladen können.

Ich dachte, ich könnte direkt auf PHP in der location /upload verweisen, aber sobald ich die Neuschreibung ausführen, wird es sowieso nach einem anderen Speicherort suchen. Bedeutet das, dass ich zwei getrennte Standorte für PHP-Skripte haben müsste? Gibt es eine Möglichkeit, die client_max_body_size nach dem Umschreiben durch andere Orte zu behalten?

Antwort

0

Wenn Sie eine spezifische client_max_body_size benötigen, muss diese innerhalb der location festgelegt (oder vererbt) werden, die die endgültige URI verarbeitet. In Ihrem Fall ist das location ~ \.php$. Wie Sie in Ihrer Frage angeben, besteht die einfachste Lösung darin, die PHP-Datei in zu verarbeiten. Dies ist einfach zu erreichen, da Sie die PHP-Konfiguration bereits in einer separaten Include-Datei haben.

Entweder ein rewrite ... break; oder überwiegendes zwei der fastcgi_param Richtlinien sollte für Sie arbeiten:

Option 1:

location /upload { 
    client_max_body_size 512M; 

    rewrite ^(.*)$ /index.php?request=$1 break; 

    include /etc/nginx/includes/php; 
} 

Siehe this document für weitere Einzelheiten.

Option 2:

location /upload { 
    client_max_body_size 512M; 

    include /etc/nginx/includes/php; 

    fastcgi_param QUERY_STRING request=$uri&$query_string; 
    fastcgi_param SCRIPT_FILENAME $document_root/index.php; 
} 
+0

Awesome! Der erste scheint zu funktionieren! Ich dachte, dass die Umleitung würde es in eine Schleife gehen, aber ich denke, wenn es den fcgi_pass im Include trifft, die es beendet. – DAB

+0

eigentlich nehme ich das zurück. Ich hatte immer noch meine maximale Körpergröße in der PHP-Position. Ich habe das Debug-Log eingeschaltet und es erscheint das PHP-Include, das 'fastcgi_pass' ignoriert hat und das Neuschreiben hat begonnen, alle Bedingungen erneut zu testen. Hier ist das Debug-Protokoll: https://gist.github.com/macdabby/13832f4257a73f82c01c. Ich werde etwas mit den Params versuchen, aber das schien auch nicht zu funktionieren. – DAB