У меня есть установка сервера с 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¶m2=value2" -X POST "http://127.0.0.1/Dibs/Dibs/callback" -H 'Host: www.test.com'
Это также говорит о том, что вы получаете два разных результата с одной и той же конфигурацией nginx, один рабочий, а другой нет. Исходя из этого, я бы начал искать причину перенаправления в другом месте.
Вероятно, вы передаете URL-адрес обратного вызова своему платежному провайдеру без префикса www, поэтому он перенаправляется вашим первым правилом перезаписи. Кстати, не используйте такую перезапись для перенаправления на хост www, используйте другой server {}
блоки с разными server_name
вместо этого см. документация nginx.