2016-03-26 33 views
2

Büyük dosya yüklemelerini tek bir konuma etkinleştirmek istiyorum ve bu konum daha sonra başka bir yere yeniden yazılır. Yeniden yazmanın diğer konfigürasyonları sıfırladığı görülüyor.Nginx'te rewrite ve client_max_body_size'yi nasıl birleştirebilirim?

Benim Yapılandırma: Ben location çıkıp server içine client_max_body_size taşırsanız

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; 
    } 
} 

, o zaman çalışır.

Hem location /upload AND location ~ \.php$'a koyarsam, o zaman çalışır. Ancak, başka konumların büyük dosyaları karşıya yüklemesini istemiyorum.

Doğrudan PHP'ye location /upload numaralı telefondan doğrudan yönelebileceğimi düşünüyordum, ancak yeniden yazmayı çalıştırdığımda başka bir yere bakacaktır. Bu, php betikleri için iki ayrı yere sahip olmak zorunda kalacağım anlamına mı geliyor? Yeniden yazdırıldıktan sonra client_max_body_size'un diğer konumlardan korunmasının bir yolu var mı?

cevap

0

Belirli bir client_max_body_size'a ihtiyacınız varsa, son URI'yi işleyen location içinde (veya devralınarak) ayarlanması gerekir. Senin durumunda, bu location ~ \.php$.

Sorunuzda belirttiğiniz gibi, en basit çözüm, PHP dosyasını location /upload'da işlemektir. PHP konfigürasyonuna sahip olduğunuzdan, bunun ayrı bir içerme dosyasında bulunması kolaydır.

Ya fastcgi_param yönerge rewrite ... break; veya ağır basan iki sizin için çalışması gerekir:

Seçenek 1:

location /upload { 
    client_max_body_size 512M; 

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

    include /etc/nginx/includes/php; 
} 

Detaylar için this document bakınız.

Seçenek 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

Müthiş! Birincisi çalışıyor gibi görünüyor! Yönlendirmenin bir döngüye girmesine neden olacağını düşünmüştüm ama sanırım fcgi_pass'a vuran şey, onu sonlandıran şeyde. – DAB

+0

aslında onu geri alıyorum. Hala maksimum beden bedenimi php konumunda tuttum. Hata ayıklama günlüğünü açtım ve "fastcgi_pass" öğesinin dikkate alınmadığı php içeriklerini görüyor ve yeniden yazma işlemi tüm koşulları yeniden test etmeye başladı. İşte hata ayıklama günlüğü: https://gist.github.com/macdabby/13832f4257a73f82c01c. Paramlar ile bir şeyler deneyeceğim, ama bu da işe yaramıyordu. – DAB