使用lighttpd web服务器时,$_GET和$_POST变量不存在。

7

我在我的Windows电脑上安装了lighttpd web服务器,但遇到了一个问题:在PHP文件中没有定义$_GET$_POST变量。

例如,我有这个简单的脚本(tmp.php):

<?php

  echo "x: '" . $_GET ['x'] . "'<br />";

?>

当我访问地址:http://localhost/tmp.php?x=123时,出现以下错误信息:
Notice: Undefined index: x in /srv/www/htdocs/tmp.php on line 3 x: ''

当我将相同的文件放到公共托管上时,我得到以下内容:
x: '123'

同时还有php命令:

empty ($_GET)

返回 true。

对于所有的 $_POST 变量都是如此。

我的 php.ini 文件中是否有任何配置错误?

命令:

print_r($_SERVER); 

得到如下结果:

Array (
 [SERVER_SOFTWARE] => lighttpd/1.4.20
 [SERVER_NAME] => localhost
 [GATEWAY_INTERFACE] => CGI/1.1
 [SERVER_PROTOCOL] => HTTP/1.1
 [SERVER_PORT] => 80
 [SERVER_ADDR] => 0.0.0.0
 [REQUEST_METHOD] => GET
 [REDIRECT_STATUS] => 200
 [QUERY_STRING] => x=123
 [REQUEST_URI] => /tmp.php?x=123
 [REMOTE_ADDR] => 127.0.0.1
 [REMOTE_PORT] => 3150
 [CONTENT_LENGTH] => 0
 [SCRIPT_FILENAME] => /srv/www/htdocs/tmp.php
 [SCRIPT_NAME] => /srv/www/htdocs/tmp.php
 [DOCUMENT_ROOT] =>
 [SYSTEMROOT] => C:\WINNT
 [HTTP_ACCEPT] => */*
 [HTTP_ACCEPT_LANGUAGE] => en-gb
 [HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)
 [HTTP_ACCEPT_ENCODING] => gzip, deflate
 [HTTP_HOST] => localhost
 [HTTP_CONNECTION] => Keep-Alive
 [WINDIR] => C:\WINNT
 [PHP_SELF] => /srv/www/htdocs/tmp.php
 [PATH_TRANSLATED] => /srv/www/htdocs/tmp.php
 [REQUEST_TIME] => 1328287189
 [argv] => Array (
 [0] => /srv/www/htdocs/tmp.php )
 [argc] => 1 
)

所以值x=123存在于$_SERVER['QUERY_STRING']$_SERVER['REQUEST_URI']中,但我不知道如何获取它。


4
通知称未定义的索引为'a',而不是'x'。你确定代码是相同的吗? - Jason Burbage
1
它是否设置正确?对于GET请求,print_r($_SERVER);输出什么? - mario
抱歉,我无法在此处发布,请查看我的原始帖子以获取print_r($_SERVER)输出。它确实显示x=123,但我不知道如何获取它。 - Andrey Rubliov
@mario 目前还没有人提供答案... - David Souther
1
@AndreyRubliov 你在 lighttpd 和 PHP 之间使用 CGI 还是 FastCGI?你的 lighttpd.conf 文件是什么样子的? - David Souther
显示剩余8条评论
3个回答

2
首先,让我们确保我们没有漏掉什么。请尝试这个。
<?php
    // test1.php
    print('GET: '); // First missing semicolon
    print_r($_GET);
    print('HTTP_GET_VARS: '); // Second missing semicolon
    print_r($HTTP_GET_VARS);
?>

其次尝试使用 $_POST

创建一个简单的HTML表单并尝试进行提交。

<?php
    // test2.php
    print_r($_POST);
?>
<form method="POST">
    <input type="text" name="myvar" />
    <input type="submit""/>
</form>

我知道这些听起来很傻,但请尝试一下,以便我们可以排除它们。

最后,请问您是否使用了重写规则?

在lighttpd.conf中查找任何有关“url.rewrite”的提及。Lighttpd不像Apache那样猜测URL,如果您使用重写,必须明确地告诉它包括查询字符串。例如(重要部分已用粗体标出-将它们添加到您的重写中)。

url.rewrite = ( "^/([a-z]+)/([a-z]+)(?*)(.*)" => "/index.php?controller=$1&action=$2&**$4**" )


我没有使用重写,并且我的 $_GET 是空的。你建议的第一个测试没有输出。 - LovesTha
一旦我添加了缺失的分号,我得到: GET:数组 ( ) HTTP_GET_VARS: - LovesTha

1
根据文档,这可能是由于 php.ini 设置 variables_order 引起的。
默认值是 EGPCS,但如果某种方式更改了它并且没有包含字母 G,则 GET 变量将被完全忽略,并且 $_GET 将为空。

谢谢,但是在我的php.ini文件中已经设置为:variables_order = "EGPFCS",所以应该没问题了吧? - Andrey Rubliov
1
我找不到字母F的任何文档,但在我的测试环境中,“EGPFCS”仍会填充“$_GET”,所以我想那不是你的问题。 - Jason Burbage

0

根据我的观察,内容长度为零,这不应该是“零”。安装 Fiddler 并检查请求期间发送的标头以及响应标头。似乎应该有标头出现问题。

敬礼


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接