我有一个服务器设置,其中有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¶m2=value2" -X POST "http://127.0.0.1/Dibs/Dibs/callback" -H 'Host: www.test.com'
这也说明,使用相同的 nginx 配置,您会得到两个不同的结果,一个可以工作,一个不行。基于此,我会开始在其他地方寻找重定向的原因。