nginx + php-fpm - thông số $ _GET của tôi ở đâu?


34

Tôi có một vấn đề kỳ lạ ở đây. Tôi vừa chuyển từ apache + mod_php sang nginx + php-fpm. Mọi thứ đều ổn, ngoại trừ vấn đề này.

Tôi có một trang web, hãy nói example.com. Khi tôi truy cập nó như example.com?test=get_param $_SERVER['REQUEST_URI']/?test=get_param$_GET['test']cũng có.

Nhưng khi tôi truy cập example.com/ajax/search/?search=get_param $_SERVER['REQUEST_URI']được /ajax/search/?search=get_paramnhưng không có $_GET['search'](không có $_GETmảng nào cả).

Tôi đang sử dụng khung Kohana. mà các tuyến đường /ajax/searchđể điều khiển, nhưng tôi đã đưa phpinfo()vào index.phpvì vậy tôi đang kiểm tra cho $_GETbiến trước khi khuôn khổ thực hiện bất cứ điều gì (phương tiện này mà disapearing get params không khuôn khổ lỗi).

Nginx.conf của tôi là như thế này

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/*;
}

và example.conf là như thế này

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 là như thế này

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;

vấn đề ở đây là gì?

Nhân tiện, có thêm vài trang web trên cùng một máy chủ, cả php dựa trên Kohana và php đơn giản, đang hoạt động hoàn hảo.

Câu trả lời:


73

Bạn không chuyển các đối số trong cuộc gọi try_files của bạn

trong câu hỏi:

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

Nên là:

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

Bạn có thể sử dụng $ query_ String hoặc $ args , chúng tương đương nhau - ngoại trừ $query_stringlà chỉ đọc (hoặc cách khác, $argscó thể được cập nhật bởi bất kỳ logic nào khác mà bạn muốn thêm)


3
Tài liệu rất riêng của +1 Slim là sai .
Brodie

^ ditto; đã dành hàng giờ cố gắng để có được điều tồi tệ được sắp xếp cho một dự án khác. Cảm ơn bạn ad7six.
Rijndael

2
Từ tài liệu mới nhất của Slim3:try_files $uri $uri/ /index.php$is_args$args;
mixdev 8/12/2015

Nếu chúng ta đang sử dụng php-fpm thay vì fastcgi thì sao? Chúng tôi không thể sử dụng cấu hình trong fastcgi.conf để lấy tên biến "$ QUERY_STRING"
NaturalBornCamper

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

1

Hãy thử quy tắc của tôi:

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;
}

Đồng thời xóa "fastcgi_param QUERY_STRING" trùng lặp trong fastcgi_params.


Điều này không hoạt động. Trên ajax/searchđó có 500 lỗi, trên example.com nó bật lên cửa sổ tải xuống và tệp đã tải xuống là index.php
egis

1
Dù sao, tôi đã đưa ra một câu trả lời, try_files $uri $uri/ index.php;phải vậy try_files $uri $uri/ /index.php?$args; #or /index.php?$query_string, mind the '?', nhưng thật tuyệt khi có ai đó giải thích điều này :)
egis

btw, nhật ký lỗi cho cấu hình của bạn, alvosu, nói could not find named location @koh.
ví dụ:

Xin lỗi, tôi đã phạm sai lầm. Tôi đã sửa "vị trí".
alvosu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.