【问题标题】:$_GET and $_POST variables do not exist when using lighttpd web server$_GET 和 $_POST 变量在使用 lighttpd 网络服务器时不存在
【发布时间】:2012-02-03 16:23:14
【问题描述】:

我在我的 Windows 计算机上安装了 lighttpd 网络服务器,但我遇到了一个问题:在 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)

返回真。

对于所有 $_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'] 中,但我不知道如何获取它。

【问题讨论】:

  • 通知说未定义的索引是'a',而不是'x'。你确定代码是一样的吗?
  • 是的,它是 x 或您定义的任何其他变量。 $_GET 和 $_POST 数组根本不存在。
  • 设置是否正确? print_r($_SERVER); 对 GET 请求说什么?
  • 也许可以试试 $_REQUEST, $_P, $_G .. 也可以试试var_dump($_SERVER); 看看查询字符串是否出现在变量中
  • @AndreyRubliov 你在 lighttpd 和 PHP 之间使用 CGI 还是 FastCGI?你的 lighttpd.conf 文件是什么样的?

标签: post get lighttpd php


【解决方案1】:

首先让我们确保我们没有遗漏任何东西。

试试这个

<?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。你建议的第一个测试没有给我任何输出。
  • 添加缺少的分号后,我得到: GET: Array ( ) HTTP_GET_VARS:
【解决方案2】:

根据文档,这可能是由 php.ini 设置 variables_order 引起的。

默认值为EGPCS,但如果以某种方式更改且不包含字母 G,则 GET 变量将被完全忽略,$_GET 将为空。

【讨论】:

  • 谢谢,但在我的 php.ini 中它设置为: variables_order = "EGPFCS" 所以看起来还可以吗?
  • 我找不到字母 F 的任何文档,但在我的测试环境中 EGPFCS 仍然填充 $_GET,所以我想这不是你的问题。
【解决方案3】:

据我所知,内容长度为零,它不应该是“零”。安装提琴手并检查请求期间发送的标头并检查响应标头。似乎应该有标题乱七八糟..

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2011-04-23
    • 2012-03-30
    • 1970-01-01
    • 2016-11-26
    • 2021-08-23
    相关资源
    最近更新 更多