Nginx 外部 POST 返回 302

Nginx 外部 POST 返回 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。我在另一台服务器上有完全相同的设置,回调工作正常。

答案1

您可能将回调 URL 传递给付款提供商时没有添加 www,因此它会被您的第一个重写规则重定向。顺便说一句,不要使用此类重写重定向到 www 主机,请使用server {}具有不同前缀的不同块server_name相反,看到nginx 文档

答案2

我认为您的问题不是出在 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 配置,您会得到两个不同的结果,一个可以工作,一个不行。基于此,我会开始在其他地方寻找重定向的原因。

相关内容