【问题标题】:Incorrect string length of $_SERVER['SERVER_NAME']$_SERVER['SERVER_NAME'] 的字符串长度不正确
【发布时间】:2015-11-29 21:34:40
【问题描述】:

所以我试图检查 Apache 服务器名称是否包含某个字符串,并注意到非常奇怪的行为(例如,if 语句中没有匹配项,即使字符串看起来完全匹配)。使用 var_dump() 我查看了包含服务器名称的变量,令我惊讶的是,我看到了这个:

string(11) "test.local:5757"

如果不计算数字,字符串只有 11 个字符。如果我使用'test.local:5757' 而不是$_SERVER['SERVER_NAME'] 声明变量,我会得到正确的长度,15。

我尝试在末尾附加一个空字符串以“重置”字符串,我什至尝试在字符串上添加额外的字母,这些字母最终被计算在内,但 5757 仍未计算在内。

有没有人经历过这样的事情?

编辑:抱歉,发帖后我没有提供足够的信息。

我遗漏的一个主要细节是我在 MAMP 之上使用 CodeKit。我的本地 MAMP 安装位于 localhost,我的 CodeKit 项目的 URL 是 test.local:5757'。但是,当我回显一个声明为$_SERVER['SERVER_NAME'] 的变量时,似乎出现了 5757 端口。更奇怪的是,回显$_SERVER['SERVER_NAME'] . ':' $_SERVER['SERVER_PORT'] 打印test.local:5757,而将冒号更改为任何其他字符,例如$_SERVER['SERVER_NAME'] . '>' $_SERVER['SERVER_PORT'],打印test.local:5757>80

以下是我所看到的更多示例:

$host = $_SERVER['SERVER_NAME'];
echo $host;
// prints 'test.local:5757'


$host = $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'];
echo $host;
// prints 'test.local:5757'


$host = $_SERVER['SERVER_NAME'] . '&' . $_SERVER['SERVER_PORT'];
echo $host;
// prints 'test.local:5757&80'


$host = $_SERVER['SERVER_NAME'];
echo $host;
// prints 'test.local:5757'
$bool = false;
if ($host == 'test.local:5757') $bool = true;
echo $bool;
// prints false;


$host = $_SERVER['SERVER_NAME'];
var dump($host);
// prints string(11) test.local:5757

很抱歉没有标记为与 CodeKit 相关。非常感谢任何帮助!

【问题讨论】:

  • 发布您使用的确切代码
  • server_name 永远不应该包含端口,所以我认为你没有在这里向我们展示一些东西
  • 缺少操作系统错误、竞争条件(考虑到 PHP 是单线程的,这是非常不可信的)或输出处理程序出错,这对我来说基本上是不可能的。 var_dump part that handles strings 打印字符串的长度,然后将相同的长度传递给PHPWRITE。宏扩展为php_output_write,它很可能最终调用php_write_stdout,除非设置了输出处理程序,fwrites 字符串具有相同的长度参数
  • 是的,您如何将服务器名称准确地放入您的变量中?需要代码来回答这个问题...

标签: php apache codekit server-name


【解决方案1】:

https://github.com/bdkjones/CodeKit/issues/440 这里有一个很好的解释,它以

结尾

简而言之,这里没有错 --> MAMP 具有正确的 Host 标头。

由于您试图区分 test.local 和 localhost,您可以使用:

if (strpos($_SERVER['HOST_NAME'],'localhost') !== false) {
    echo 'localhost';
} else {
    echo 'not localhost';
}

【讨论】:

  • 谢谢谢谢,看来您发布的帖子准确描述了我的问题。
  • 对于遇到此问题的其他人来说,问题是 CodeKit 在 PHP 运行后覆盖了 HOST_NAME,所以即使 $_SERVER['HOST_NAME'] 打印了一个 15 个字符的字符串,该变量以某种方式引用了 MAMP 主机别名,其实就是11个字符……
猜你喜欢
  • 1970-01-01
  • 2010-11-27
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2015-04-30
  • 1970-01-01
相关资源
最近更新 更多