nginx + php-fpm - मेरे $ _GET परम कहाँ हैं?


34

मुझे यहां एक अजीब समस्या है। मैं सिर्फ Apache + mod_php से nginx + php-fpm में चला गया। इस एक समस्या को छोड़कर सब कुछ ठीक हो गया।

मेरे पास एक साइट है, आइए example.com कहते हैं। जब मैं इसे एक्सेस करता हूं तो जैसे example.com?test=get_param $_SERVER['REQUEST_URI']है /?test=get_paramऔर एक है $_GET['test']

लेकिन मैं पहुँच जब example.com/ajax/search/?search=get_param $_SERVER['REQUEST_URI']है /ajax/search/?search=get_paramअभी तक कोई $_GET['search'](वहाँ कोई है $_GETसब पर सरणी)।

मैं कोहना ढांचे का उपयोग कर रहा हूं। /ajax/searchनियंत्रक के लिए कौन से मार्ग हैं , लेकिन मैंने ऐसा इसलिए phpinfo()किया है index.phpक्योंकि मैं $_GETकुछ भी करने से पहले चरों के लिए जाँच कर रहा हूं (इसका अर्थ यह है कि अनुपलब्ध होने वाले परिमार्जन फ्रेमवर्क दोष नहीं हैं)।

मेरा nginx.conf ऐसा है

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

और example.conf ऐसा है

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 ऐसा है

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;

यहां क्या समस्या है?

वैसे, एक ही सर्वर पर कुछ और साइटें हैं, कोहना आधारित और सादा php, जो पूरी तरह से काम कर रहे हैं।

जवाबों:


73

आप अपने try_files कॉल में तर्क प्राप्त नहीं कर रहे हैं

प्रश्न में:

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

होना चाहिए:

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

आप या तो $ query_string या $ args का उपयोग कर सकते हैं , वे समतुल्य हैं - $query_stringकेवल पढ़ने के लिए (या वैकल्पिक रूप से, $argsकिसी भी अन्य तर्क से अपडेट किया जा सकता है जिसे आप जोड़ना चाह सकते हैं)


3
+1 स्लिम का स्वयं का प्रलेखन गलत है
ब्रोडी

^ डिट्टो; किसी अन्य परियोजना के लिए छंटनी की गई चीज़ को पाने के लिए घंटों बिताए। शुक्रिया ad7six
रिजिन्देल

2
नवीनतम स्लिम 3 प्रलेखन से:try_files $uri $uri/ /index.php$is_args$args;
मिक्सदेव

क्या होगा अगर हम fastcgi के बजाय php-fpm का उपयोग कर रहे हैं? हम चर नाम "$ query_string" को पुनः प्राप्त करने के लिए fastcgi.conf में विन्यास का उपयोग नहीं कर सकते हैं
NaturalBornCamper


1

मेरे नियम आज़माएं:

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

इसके अलावा डुप्लीकेट "fastcgi_param QUERY_STRING" को भी fastcgi_params में हटाएं।


यह काम नहीं करता है। पर ajax/searchयह example.com यह डाउनलोड पॉपअप विंडो खुलेगी, पर 500 त्रुटि, देता है और डाउनलोड की गई फ़ाइल index.php है
रक्षा

1
वैसे भी, मैं एक जवाब के साथ आया हूं, try_files $uri $uri/ index.php;अवश्य होगा try_files $uri $uri/ /index.php?$args; #or /index.php?$query_string, mind the '?', लेकिन यह अच्छा होगा कि किसी ने इसे समझाया :)
एग्जिस

btw, त्रुटि अपने विन्यास के लिए लॉग इन करें, अल्वोसु, कहते हैं could not find named location @koh
अर्गिस

क्षमा करें, मुझसे एक गलती हुई। मैंने "स्थान" सही किया।
अल्वोसु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.