2016-03-26 12 views
2

大きなファイルのアップロードを1つの場所に有効にしたい場合は、その場所を別の場所に書き換えます。書き換えによって他の設定がリセットされているようです。nginxでrewriteとclient_max_body_sizeをどのように組み合わせることができますか?

私の設定:私はlocationから出てserverにclient_max_body_sizeを移動した場合

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

、それが動作します。

location /uploadlocation ~ \.php$の両方に入力すると、それも動作します。しかし、他の場所で大きなファイルをアップロードすることはできません。

私はPHPに直接location /uploadで直接指示できると考えていましたが、書き換えを実行すると、とにかく別の場所が検索されます。それは私がPHPスクリプトの2つの別の場所を持つ必要があるということですか?書き換え後に他の場所に保存する方法はありますか?

答えて

0

client_max_body_sizeが必要な場合は、最終URIを処理するlocationの中で設定する(継承する)必要があります。あなたの場合、それはlocation ~ \.php$です。

あなたの質問に示されているように、最も簡単な解決策は、PHPファイルをlocation /uploadで処理することです。すでにPHPの設定が別のインクルードファイルにあるので、これは簡単に実現できます。

どちらかfastcgi_paramディレクティブのrewrite ... break;やオーバーライド2はあなたのために働く必要があります。

オプション1:

location /upload { 
    client_max_body_size 512M; 

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

    include /etc/nginx/includes/php; 
} 

詳細はthis documentを参照してください。

オプション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

すごいです!最初のものが動作しているようです!私はリダイレクトがループに入る原因になると思っていましたが、終端するインクルードのfcgi_passにヒットすると思います。 – DAB

+0

実際、私はそれを取り戻す。私はまだphpの場所で私の最大ボディサイズを持っていた。私はデバッグログを有効にし、 'fastcgi_pass'を含むphpインクルードが無視され、再書き込みがすべての条件を再度テストするようになりました。デバッグログは次のとおりです:https://gist.github.com/macdabby/13832f4257a73f82c01c。私はparamsで何かを試してみるだろうが、それはどちらもうまくいかないようだ。 – DAB

関連する問題