Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

Hi we have recently switched our Magento application from Apache to nginx and PHP-FPM on CentOS 5.6. We have an external payment gateway that sends us back some transaction information. The PHP file that handles this has a if($_SERVER['REQUEST_METHOD'] == 'POST') condition.

There is code above this IF statement in that PHP file which is executing normally. However, all the code inside the IF statement is not being executed.

My etc/nginx/conf.d/domain.conf file:

fastcgi_read_timeout 240;    

server {
    listen 80;
    server_name domain.com;
    rewrite / $scheme://www.$host$request_uri permanent; ## Forcibly prepend a www
}

server {
    listen 80 default;

    ## SSL directives might go here
    listen 443 default ssl;
    ssl_certificate     /etc/ssl/domain.com.crt;
    ssl_certificate_key /etc/ssl/domain.key;

    server_name www.domain.com *.domain.com; ## Domain is here twice so server_name_in_redirect will favour the www
    root /path/to/root/;

    location / {
        index index.html index.php; ## Allow a static html file to be shown first
        try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
        expires 30d; ## Assume all files are cachable
    }

    location /phpmyadmin {
        auth_basic "Restricted Access";
        auth_basic_user_file htpasswd_file;
        alias /path/to/phpmyadmin/;
        index index.php; ## Allow a static html file to be shown first
        try_files $uri $uri/ @fastcgi;
    }

    ## These locations would be hidden by .htaccess normally
    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/ { ## Allow admins only to view export folder
        auth_basic           "Restricted"; ## Message shown in login window
        auth_basic_user_file htpasswd; ## See /etc/nginx/htpassword
        autoindex            on;
    }

    location  /. { ## Disable .htaccess and other hidden files
        return 404;
    }

    location @handler { ## Magento uses a common front handler
        rewrite / /index.php;
    }

    location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler
        rewrite ^(.*.php)/ $1 last;
    }   


    location ~ .php$ { ## Execute PHP scripts
        if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss

        expires        off; ## Do not cache dynamic content
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  HTTPS $fastcgi_https;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  MAGE_RUN_CODE default; ## Store code is defined in administration > Configuration > Manage Stores
        fastcgi_param  MAGE_RUN_TYPE store;
        include        fastcgi_params; ## See /etc/nginx/fastcgi_params
    }
}

The relevant parts of our /etc/nginx/conf.d file:

http { include /etc/nginx/mime.types; default_type application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

sendfile        on;
autoindex off;
map $scheme $fastcgi_https { ## Detect when HTTPS is used
    default off;
    https on;
}
#tcp_nopush     on;

keepalive_timeout  10;

gzip  on;
gzip_comp_level 2;
gzip_proxied any;
gzip_types      text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

#
# The default server
#
server {
    listen       80;
    server_name  _;

# Load config files from the /etc/nginx/conf.d directory
include /etc/nginx/conf.d/*.conf;

}

Any ideas what we can do to get this POST condition working?

share|improve this question

1 Answer 1

Your /etc/nginx/fastcgi_params file should contain (among several other things) the following line:

fastcgi_param  REQUEST_METHOD     $request_method;

This is as shipped. Check to make sure it wasn't altered.

In my own PHP scripts I take a very simple shortcut to check if it was a POST request:

if ($_POST) {
    # Process some POST variables
}
# Display the web page
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.