2014-08-30 44 views
0

我正在運行nginx 1.6.1和php-fpm 5.5.9。我有一個設置來製作海基會的網址。見nginx的配置的相關部分:帶有SEF URL的Nginx不通過GET變量

location/{ 
    # first try if the file or directory exists; if not, redirect to index.php 
    # then index.php will see what to do based on the REQUEST_URI 
    try_files $uri $uri/ /index.php; 
} 

# and just the basic php-fpm setup... 
location ~* \.php$ { 
    try_files $uri =404; 
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    # fastcgi.conf is as distributed, and doesn't contain anything special 
    # anyway, the file is shown below 
    include fastcgi.conf; 
} 

然後,在index.php文件:

// Just for testing 
var_dump($_SERVER); 
var_dump($_GET); 

現在,有一些不同的東西我嘗試了:

My request   REQUEST_URI  GET is passed? 
----------------------------------------------- 
/index.php?test /index.php?test Yes 
/index.php/?test /index.php/?test No 
/?test    /?test   Yes 
?test    (redirected to /?test) 
/some-dir?test  /some-dir?test No 
/some-dir/?test /some-dir/?test No 

/index.php/?test不起作用不是什麼大不了的事。無論如何,最後我們可以使用nginx刪除最後的斜線。但爲什麼最後兩種情況下的GET變量沒有通過?

當然,我可以用PHP中的REQUEST_URI使用parse_url做一些事情,但如果我只用$ _GET訪問變量會好得多。出了什麼問題?


爲了完整起見,fastcgi.conf:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
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 HTTPS    $https if_not_empty; 

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; 

回答

1

一不小心,我發現瞭解決方案:第一位置塊(爲/)是錯誤的。它不應該改寫爲/index.php,但/index.php$is_args$query_string

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

docs: - 「?」

$is_args如果請求行有參數,或一個空字符串,否則
$args - 請求行中的參數

現在,爲了完整起見,還可以刪除尾部斜線,在server塊中使用此重寫指令。

rewrite ^/(.*)/$ /$1 permanent;