Dyrektywa NGINX „client_max_body_size” nie działa w bloku „location”

15

Mam /adminkatalog na swojej stronie i chciałbym umożliwić administratorom przesyłanie dużych plików za pośrednictwem formularzy internetowych. Oto jak wygląda moja nginx.com:

http {
    # ...
    client_max_body_size 16M;
    # ...

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

        location /admin {
            client_max_body_size 256M;
        }

        # ...
    }
}

To nie działa. /admin/index.phpskrypt nie może przesyłać plików większych niż 16 Mb: 413 Żądanie jednostki jest zbyt duże

Jednak jeśli przejdę client_max_body_sizedo serverblokowania, wszystko działa dobrze. Ale nie chciałbym wprowadzać tej zmiany tylko dla adminkatalogu.

Zgodnie z dokumentami , client_max_body_sizemoże być umieszczony wewnątrz locationbloku, aby zastąpić ustawienie tylko dla żądanej ścieżki.

Co może być nie tak?

Temnovit
źródło

Odpowiedzi:

15

Działa dobrze, problem polega na tym, że źle zrozumiałeś, jak działają lokalizacje. Nginx zastosuje tylko jeden blok lokalizacji, nigdy więcej niż jeden. Więc kiedy masz dwie lokalizacje

location ~ \.php$a location /adminidentyfikator URI jest /admin/index.phpwtedy twoją pierwszą lokalizacją, ale druga nie. Nawet jeśli użyjesz przepisywania w obrębie lokalizacji, to nginx odrzuci dyrektywy i dokona ponownej analizy dla nowej lokalizacji.

Jest to również powód, dla którego zawsze publikujesz pełne konfiguracje, aby nie ukryć tego, co faktycznie jest złe.

Martin Fjordvald
źródło
Przepraszamy, że nie opublikowałeś pełnej konfiguracji, masz rację. Jeśli chodzi o odpowiedź, to nie może być prawda. Oto przykład z dokumentacji: wiki.nginx.org/HttpCoreModule#location A w innych miejscach dobrze działa dla mnie wiele bloków lokalizacji.
Temnovit,
1
Przepraszam, ale w 100% ma rację. Nginx może przeszukiwać wiele bloków lokalizacji, ale zawsze będzie stosować tylko dyrektywy jednego z nich. To, który wybierze, zależy od reguł udokumentowanych na połączonej stronie.
Martin Fjordvald
@MartinFjordvald jakie jest na to rozwiązanie?
chaosguru
Spójrz na configuration Elink: nginx.org/en/docs/http/ngx_http_core_module.html#location
holmberd
1
@Juanitocalero nie naprawdę nie, oficjalna dokumentacja nie jest bardzo dobrym przewodnikiem dla początkujących, jest raczej dokumentacją referencyjną dotyczącą składni i podstawowych informacji.
Martin Fjordvald