Назад | Перейти на главную страницу

Внешний POST Nginx возвращает 302

У меня есть установка сервера с Nginx 1.1.4 + PHP-FPM + APC. На этом сервере Magento 1.5.1.0 установка идет. У меня проблемы с тем, что обратный вызов от поставщика платежей - это POST, а Nginx возвращает 302, что приводит к сбою обратного вызова.

Это файл конфигурации Nginx для сайта:

server {
    listen 80;
    server_name <domain>;
    root <path to root>;

    if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
            set $host_with_www www.$1;
            rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }

    location / {
            index index.html index.php;
            try_files $uri $uri/ @handler;
            expires 30d;
    }

    location /nginx_status {
            stub_status on;
            access_log   off;
            #allow 127.0.0.1;
            #deny all;
            allow all;
    }

    location /app/ { deny all; }
    location /includes/ { deny all; }
    location /lib/ { deny all; }
    location /media/downloadable/ { deny all; }
    location /pkginfo/ { deny all; }
    location /report/config.xml { deny all; }
    location /var/ { deny all; }

    location /var/export/ {
            auth_basic "Restricted";
            auth_basic_user_file htpasswd;
            autoindex on;
    }

    location /. {
            return 404;
    }

    location @handler {
            rewrite / /index.php;
    }

    location ~ .php/ {
            rewrite ^(.*.php)/ $1 last;
    }

    location ~ .php$ { ## Execute PHP scripts
            if (!-e $request_filename) { rewrite / /index.php last; }

            expires off; ## Do not cache dynamic content
            #fastcgi_pass 127.0.0.1:9000;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param  QUERY_STRING     $query_string;
            fastcgi_param  REQUEST_METHOD   $request_method;
            fastcgi_param  CONTENT_TYPE     $content_type;
            fastcgi_param  CONTENT_LENGTH   $content_length;
            fastcgi_param MAGE_RUN_CODE default;
            fastcgi_param MAGE_RUN_TYPE store;
            fastcgi_buffers 256 16k;
            fastcgi_buffer_size 32k;
            include fastcgi_params; ## See /etc/nginx/fastcgi_params
    }
}

Когда выполняется обратный вызов, журнал доступа выглядит так:

85.236.67.1 - - [18/Oct/2011:09:52:03 +0000] "POST /Dibs/Dibs/callback HTTP/1.1" 302 5 "-" "DIBS"

Затем пользователь перенаправляется на /Dibs/Dibs/success который работает без проблем. Я попытался отредактировать контроллер обратного вызова, чтобы просто echo 1; так что с кодом в функции все в порядке.

Есть ли способ никогда не делать 302 редирект на /Dibs/Dibs/callback или мне не хватает какой-то конфигурации в Nginx или PHP, которая не допускает внешнего POST?

Стоит упомянуть, что я использую скрипт установщика Vladgh, найденный здесь для NginX, MySQL, PHP (с APC и Suhosin) https://github.com/vladgh/VladGh.com-LEMP. У меня точно такая же настройка на другом сервере, где обратный вызов работает нормально.

Я думаю, ваша проблема не в nginx, а в приложении PHP, которое он обслуживает. На моем локальном компьютере я не получаю перенаправление при отправке почтового запроса на тестовый сервер. Конечно, он настроен немного иначе, чем ваш, но несущественно.

server {
    listen 127.0.0.1:80;

    server_name www.test.com;
    root /var/www/test;

    if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
            set $host_with_www www.$1;
            rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }

    location / {
            index index.html index.php;
            try_files $uri $uri/ @handler;
            expires 30d;
    }


    location /app/ { deny all; }
    location /includes/ { deny all; }
    location /lib/ { deny all; }
    location /media/downloadable/ { deny all; }
    location /pkginfo/ { deny all; }
    location /report/config.xml { deny all; }
    location /var/ { deny all; }

    location /var/export/ {
            auth_basic "Restricted";
            auth_basic_user_file htpasswd;
            autoindex on;
    }

    location /. {
            return 404;
    }

    location @handler {
            rewrite / /index.php;
    }

    location ~ .php/ {
            rewrite ^(.*.php)/ $1 last;
    }

    location ~ .php$ { ## Execute PHP scripts
            if (!-e $request_filename) { rewrite / /index.php last; }

                include snippets/fastcgi-php.conf;

                fastcgi_pass php;

    }
}

В корне документа у меня есть следующий скрипт index.php:

<?php

var_dump($_GET);

echo "<hr>";

if (isset($_POST)) {
        var_dump($_POST);
}

Когда я создаю сообщение в / Dibs / Dibs / callback, меня не перенаправляют.

curl -d "param1=value1&param2=value2" -X POST "http://127.0.0.1/Dibs/Dibs/callback" -H 'Host: www.test.com'

Это также говорит о том, что вы получаете два разных результата с одной и той же конфигурацией nginx, один рабочий, а другой нет. Исходя из этого, я бы начал искать причину перенаправления в другом месте.

Вероятно, вы передаете URL-адрес обратного вызова своему платежному провайдеру без префикса www, поэтому он перенаправляется вашим первым правилом перезаписи. Кстати, не используйте такую ​​перезапись для перенаправления на хост www, используйте другой server {} блоки с разными server_name вместо этого см. документация nginx.