web-dev-qa-db-fra.com

nginx + php-fpm - où sont mes paramètres $ _GET?

J'ai un problème étrange ici. Je viens de passer d'Apache + mod_php à nginx + php-fpm. Tout s'est bien passé, sauf ce seul problème.

J'ai un site, disons exemple.com. Lorsque j'y accède comme example.com?test=get_param$_SERVER['REQUEST_URI'] Est /?test=get_param Et il y a aussi un $_GET['test'].

Mais quand j'accède à example.com/ajax/search/?search=get_param$_SERVER['REQUEST_URI'] Est /ajax/search/?search=get_param Mais il n'y a pas de $_GET['search'] (Il n'y a pas du tout de tableau $_GET).

J'utilise le framework Kohana. qui achemine /ajax/search vers le contrôleur, mais j'ai mis phpinfo() à index.php donc je vérifie les variables $_GET avant que le framework ne fasse quoi que ce soit (cela signifie que les paramètres get disparus ne sont pas la faute des frameworks).

Mon nginx.conf est comme ça

worker_processes  4;
pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    index index.html index.php;
    autoindex on;
    autoindex_exact_size off;
    include       mime.types;
    default_type  application/octet-stream;
    server_names_hash_bucket_size 128;
    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  logs/access.log  main;
    error_log   logs/error.log   debug;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     off;

    keepalive_timeout  2;

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


    include sites-enabled/*;
}

et example.conf est comme ça

server {
  listen 80;
  server_name www.example.com;
  rewrite ^ $scheme://example.com$request_uri? permanent;
}




server {
    listen   80;
    server_name example.com;
    root /var/www/example/;

    location ~ /\. {
        return 404;
    }

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        /usr/local/nginx/conf/fastcgi_params;
    }

    location ~* ^/(modules|application|system) {
        return 403;
    }

        # serve static files directly
        location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ {
                access_log        off;
                expires           30d;
        }
}

fastcgi_params est comme ça

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  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;


fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;


fastcgi_param QUERY_STRING    $query_string;
fastcgi_param PATH_INFO       $fastcgi_path_info;

Quel est le problème ici?

Soit dit en passant, il y a quelques autres sites sur le même serveur, à la fois basés sur Kohana et en php ordinaire, qui fonctionnent parfaitement.

34
egis

Vous ne passez pas d'arguments get dans votre appel try_files

dans la question:

location / {
    try_files $uri $uri/ /index.php;
}

Devrait être:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

Vous pouvez utiliser $ query_string ou $ args , ils sont équivalents - sauf $query_string est en lecture seule (ou alternativement, $args peut être mis à jour par toute autre logique que vous pourriez souhaiter ajouter)

73
AD7six
location / {
   try_files $uri $uri/ /index.php$is_args$args;
}
2
Smokie

Essayez mes règles:

location / {
    try_files $uri $uri/ @koh;
}

location @koh {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www/example/index.php;
    include        /usr/local/nginx/conf/fastcgi_params;
}

Supprimez également le "fastcgi_param QUERY_STRING" en double dans fastcgi_params.

1
alvosu