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.