.png)
私は解決策を探していますこの問題その質問の設定が機能しない理由は理解していますが、機能するように解決策を見つけようとしています。
アイデアは、特定の URL でのみ大きなファイルのアップロードを許可することです。location
これにはブロックを使用できますが、問題は次のとおりです。PHP フロント コントローラー パターンがあります。
location ~ \.php {
# ...
fastcgi_pass unix:/tmp/php5-fpm.sock;
}
私の全体の構成は次のようになります:
# ...
http {
# ...
client_max_body_size 512K;
server {
server_name example.com;
root /var/www/example.com/public;
location / {
try_files $uri /index.php?$query_string;
}
location /admin/upload {
client_max_body_size 256M;
}
location ~ \.php {
# ...
fastcgi_pass unix:/tmp/php5-fpm.sock;
}
}
}
私の理解では、適用されるロケーション ブロックは 1 つだけです。したがって、デフォルトのリクエスト サイズが 512K の場合、すべてのリクエストはフロント コントローラ パターンを通じて照合されるため、256M は適用されません~ \.php
。
この場合、私の考えは正しいでしょうか。もし正しいとすれば、訪問者が にアップロードする場合以外は何もアップロードできないようにするには、何を設定すればよいでしょうかadmin/upload
。
答え1
パスが仮想の場合/admin/upload
、次のように動作させることができます。
location / {
try_files $uri /index.php?$args;
}
location /admin/upload {
client_max_body_size 256M;
include inc/php.conf;
rewrite ^(.*)$ /index.php?$args break;
}
location ~ \.php$ {
include inc/php.conf;
}
あまりきれいではありませんが、機能します。
答え2
2 つの PHP の場所を定義しますか?
location ~ ^/admin/upload/.+\.php$
{
client_max_body_size 256M;
include /etc/nginx/conf.d/php-fpm.conf;
}
location ~ \.php
{
include /etc/nginx/conf.d/php-fpm.conf;
}
あまりきれいではないかもしれませんが... 機能的には問題ないはずです...
答え3
複数の場所を使用することは可能ですが、少し複雑です。
上で説明したようにtry_files
または を使用すると、 は、期待される場所ブロックの ではなく、より高いコンテキストのに設定されます。rewrite
client_max_body_size
client_max_body_size
PHP FastCGI 構成を、 などのインクルード可能なファイルに移動しますphp-conf.conf
。
次に、次のような構成を使用します。
location / {
# try to serve file directly, fallback to index.php
try_files $uri /index.php$query_string;
}
location ~ ^/admin/upload$ {
client_max_body_size 4m;
include /etc/nginx/php-conf.conf;
fastcgi_param SCRIPT_FILENAME $realpath_root/index.php;
}
location ~ ^/index\.php(/|$) {
include /etc/nginx/php-conf.conf;
internal;
}
SCRIPT_FILENAME
異なるスクリプト名が設定されている場合は、使用するために上書きする必要があることに注意してくださいindex.php
。これは、 が原因で発生する可能性がありますfastcgi_split_path_info ^(.+\.php)(/.*)$;
。