Nginx конфигурация: POST-запрос не проходит (301 редирект)

POST-запросы работают правильно при следующей конфигурации:

server {
    listen 80 default;

    client_max_body_size 108M;

    root /app/public;
    index index.php;

    if (!-e $request_filename) {
        rewrite ^.*$ /index.php last;
    }

    location ~ \.php$ {
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }
}

Но, когда я перемещаю его на другую локацию, он перестает работать (просто редиректится "POST /v1/notifications HTTP/1.1" 301"):

server {
    listen 80;

    client_max_body_size 108M;
    root /app/public;
    index index.php;

    location /api/ {
        root /app/public;
    }

    location /v1/notifications {
        alias /app/public;
        index index.php index.html;

        if (!-e $request_filename) {
            rewrite ^.*$ index.php last;
        }

        location ~* "\.php$" {
            fastcgi_pass php-fpm:9000;
            index index.php;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_buffers 16 16k;
            fastcgi_buffer_size 32k;
            include fastcgi_params;
        }
    }

    #Это для другого контейнера приложения
    location / {
        proxy_pass http://application:80;
        root /var/www/html;
        proxy_redirect off;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Что не так? Есть идеи?



Обновление от 26.02.2020: В моём случае решение выглядит следующим образом:

location /v1/notifications {
    alias /app/public;
    index index.php index.html;

    try_files $uri /v1/notifications/index.php;    

    location ~* "\.php$" {
        ...
    }
}

Т.к. был использован alias в конфиге с кастомным location, /v1/notifications указывает в директорию /app/public. Т.е. дефолтное поведение - идти в index.php (не зависимо от того, есть там rewrite или его нет). Чтобы избавиться от дефолтного поведения - есть спасительный оператор try_files.


Ответы (0 шт):