2014-08-30 46 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;