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


34

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 problème.

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

Mais lorsque l' accès I example.com/ajax/search/?search=get_param $_SERVER['REQUEST_URI']est /ajax/search/?search=get_paramencore il n'y a pas $_GET['search'](il n'y a pas $_GETensemble du tout).

J'utilise le framework Kohana. quelles routes mènent /ajax/searchau contrôleur, mais je l'ai mis phpinfo()à index.phpdonc je vérifie les $_GETvariables avant que le framework ne fasse quoi que ce soit (cela signifie que les paramètres get disparus ne sont pas des défauts 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?

En passant, il y a peu de sites sur le même serveur, à la fois basés sur Kohana et php simple, qui fonctionnent parfaitement.

Réponses:


73

Vous ne transmettez pas les 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 soit $ query_string ou $ args , ils sont équivalents - sauf en $query_stringlecture seule (ou alternativement, $argspeuvent être mis à jour par toute autre logique que vous souhaitez ajouter).


3
La propre documentation de +1 Slim est fausse .
Brodie

^ idem; passé des heures à essayer de régler le malheureux pour un autre projet. Merci ad7six.
Rijndael

2
De la dernière documentation Slim3:try_files $uri $uri/ /index.php$is_args$args;
mixdev

Et si nous utilisions php-fpm au lieu de fastcgi? Nous ne pouvons pas utiliser la configuration dans fastcgi.conf pour récupérer le nom de variable "$ query_string"
NaturalBornCamper

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

1

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 les "fastcgi_param QUERY_STRING" dupliqués dans fastcgi_params.


Ça ne marche pas. Sur ajax/searchcela donne 500 erreur, sur example.com il apparaît une fenêtre de téléchargement et le fichier téléchargé est index.php
egis

1
Quoi qu'il en soit, je suis venu avec une réponse, try_files $uri $uri/ index.php;doit être try_files $uri $uri/ /index.php?$args; #or /index.php?$query_string, mind the '?', mais il serait bien que quelqu'un a expliqué cela :)
egis

btw, journal des erreurs pour votre config, alvosu, dit could not find named location @koh.
egis

Désolé, je me suis trompé. J'ai corrigé "emplacement".
Alvosu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.