PHP $_SERVER["SERVER_NAME"]与 $_SERVER['HTTP_HOST'] 区别

 更新时间:2016年11月25日 15:27  点击:2022
最近在开发站群软件,用到了根据访问域名判断子站点的相关问题。PHP获取当前域名有两个变量 HTTP_HOST 和 SERVER_NAME,我想知道两者的区别以及哪个更加可靠

先我想说,百度上那些转来转去的文章都是扯淡!
有说相同的,有说不同的,都没说明原因,没经过验证就互相转来转去的,浪费观众时间。

下面说说本人经过亲自验证 + 查阅官方文档 + 官方BUG列表 + 官方邮件列表 + sitepoint + webmasterworld + google的总结:

相同点:

当满足以下三个条件时,两者会输出相同信息。
1. 服务器为80端口
2. apache的conf中ServerName设置正确
3. HTTP/1.1协议规范

不同点:

1. 通常情况:

_SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。
_SERVER["SERVER_NAME"] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。

2. 当服务器为非80端口时:

_SERVER["HTTP_HOST"] 会输出端口号,例如:111cn.net:8080
_SERVER["SERVER_NAME"] 会直接输出ServerName值
因此在这种情况下,可以理解为:HTTP_HOST = SERVER_NAME : SERVER_PORT

3. 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时:

httpd.conf配置如下:

 代码如下 复制代码

<virtualhost *>
ServerName 111cn.net
ServerAlias www.111cn.net
</virtualhost>
客户端访问域名www.111cn.net
_SERVER["HTTP_HOST"] 输出 www.111cn.net
_SERVER["SERVER_NAME"] 输出 111cn.net

所以,在实际程序中,应尽量使用_SERVER["HTTP_HOST"] ,比较保险和可靠。

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,格式如下:

可见请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。

Http请求方法和响应状态吗整理
HTTP请求方法:

    GET: 请求指定的页面信息,并返回实体主体。
    HEAD: 只请求页面的首部。
    POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
    PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
    DELETE: 请求服务器删除指定的页面。
    OPTIONS: 允许客户端查看服务器的性能。
    TRACE: 请求服务器在响应中的实体主体部分返回所得到的内容。
    PATCH: 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
    MOVE: 请求服务器将指定的页面移至另一个网络地址。
    COPY: 请求服务器将指定的页面拷贝至另一个网络地址。
    LINK: 请求服务器建立链接关系。
    UNLINK: 断开链接关系。
    WRAPPED: 允许客户端发送经过封装的请求。
    Extension-mothed:在不改动协议的前提下,可增加另外的方法。


HTTP响应状态码:
① 客户方错误
100  继续
101  交换协议
② 成功
200  OK
201  已创建
202  接收
203  非认证信息
204  无内容
205  重置内容
206  部分内容
③ 重定向
300  多路选择
301  永久转移
302  暂时转移
303  参见其它
304  未修改(Not Modified)
305  使用代理
④ 客户方错误
400  错误请求(Bad Request)
401  未认证
402  需要付费
403  禁止(Forbidden)
404  未找到(Not Found)
405  方法不允许
406  不接受
407  需要代理认证
408  请求超时
409  冲突
410  失败
411  需要长度
412  条件失败
413  请求实体太大
414  请求URI太长
415  不支持媒体类型
⑤ 服务器错误
500  服务器内部错误
501  未实现(Not Implemented)
502  网关失败
504  网关超时
505 HTTP版本不支持

星际的兵种属性随着对平衡性的调节,会进行修改。如果这样的话,我们就要考虑减少一个事件和具体处理的关联性。


比如一颗原子弹投下的瞬间,在杀伤范围内的部队或者建筑都会减少血,但是随着距离中心点的远近,受损程度是不同的,而且不同的兵种和建筑受损情况是不同的。


待解决的问题:原子弹投下的瞬间,将杀伤的处理分别交给杀伤范围内的部队或者建筑自己的方法处理。


思路:建立一个接口,让所有的部队或者建筑实现。

 

职责链模式(Chain of Responsibility)示例:

 代码如下 复制代码

<?php

//被原子弹攻击的接口

interface NuclearAttacked {

    //处理被原子弹攻击的方法,参数为投放点的x和y坐标

  public function NuclearAttacked($x, $y);

}

//人族的基地,实现被原子弹攻击的接口,其他的内容暂时不考虑

class CommandCenter implements NuclearAttacked {

    //处理被原子弹攻击的方法,参数为投放点的x和y坐标

  public function NuclearAttacked($x, $y)

  {

    //根据离原子弹中心的距离,定义减少的血,如果超出了剩余的血,就炸掉

  }

}

//巡洋舰(俗称大和),实现被原子弹攻击的接口,其他的内容暂时不考虑

class Battlecruiser implements NuclearAttacked {

    //处理被原子弹攻击的方法,参数为投放点的x和y坐标

  public function NuclearAttacked($x, $y)

  {

    //根据离原子弹中心的距离,定义减少的血,如果超出了剩余的血,就炸掉

  }

}

//原子弹类

class Nuclear {

//被原子弹攻击的对象

public $attackedThings;

    //添加被原子弹攻击的对象

  public function addAttackedThings($thing)

  {

    //添加被原子弹攻击的对象

    $this->attackedThings[] = $thing;

  }

    //原子弹爆炸的方法,参数为投放点的x和y坐标

  public function blast($x, $y)

  {

      //把爆炸的事情交给所有涉及的对象,让他们自己处理

       foreach ($this->attackedThings as $thing)

       {

           //把爆炸的事情交给所有涉及的对象,让他们自己处理

          $thing->NuclearAttacked($x, $y);

       }

  }

}

//新建一个基地对象

$CommandCenter = new CommandCenter();

//新建一个巡洋舰对象

$Battlecruiser = new Battlecruiser();

//造了一颗原子弹

$Nuclear2 = new Nuclear();

//假设投放成功,那个瞬间一个基地对象和一个巡洋舰对象在杀伤范围内

$Nuclear2->addAttackedThings($CommandCenter);

$Nuclear2->addAttackedThings($Battlecruiser);

//原子弹爆炸,这样就把这个事件交给那些涉及的对象的处理方法,假设投放点的x和y坐标是2353, 368

$Nuclear2->blast(2353, 368);

?>

用途总结:职责链模式可以将一个涉及到多个对象的事件的处理交给对象自己处理,减少关联性。

在php中获取图片大小我们可以使用getimagesize函数,这个函数是用于获取图像的尺寸的函数,下面我们一起来看例子。

利用getimagesize函数就可以获取

 代码如下 复制代码

/*

    
php 获取图片尺寸的方法

*/

$url='/images/201203/08/1331189004_28093400.jpg';
 
$imageInfo=getimagesize($url);
print_r($imageInfo);
/*

 
Array

(

    
[0] => 139

    
[1] => 162

    
[2] => 2

    
[3] => width="139" height="162"

    
[bits] => 8

    
[channels] => 3

    
[mime] => image/jpeg

)

 
*/

利用我们获取的宽度与高度我们对图片进行设置

 代码如下 复制代码

<?php/* 1.jpg为你想获得其尺寸的图片 */
$arr = getimagesize("1.jpg");
/**
 * 这里$arr为一个数组类型
 * $arr[0] 为图像的宽度
 * $arr[1] 为图像的高度
 * $arr[2] 为图像的格式,包括jpg、gif和png等
 * $arr[3] 为图像的宽度和高度,内容为 width="xxx" height="yyy"
 */
/* 以下两行代码输出的内容都是一样的 */
echo "<img src="1.jpg" $arr[3] alt="" />";
echo "<img src="1.jpg" width="$arr[0]" height="$arr[1]" alt="" />";
?>

发的文章如果我每一篇都是手工查的话是非常的累的,这里可以利用一个简单的php函数来帮我们实现自动检测,下面我们就利用php curl来做一个模仿用户去访问百度的wgbb例子,希望此例子对各位会有所帮助哦。

前几天到贴吧晒度娘收录的时候

我晒了一幅图

php curl 检查百度是否收录文章的例子

有吧友问我:

文章上面的"百度已收录(仅管理员可见)"是怎么实现的

只要在主题的function.php里添加以下代码就可以实现啦~


例子。

 代码如下 复制代码

function d4v($url){
 $url='http://www.baidu.com/s?wd='.$url;
 $curl=curl_init();
 curl_setopt($curl,CURLOPT_URL,$url);
 curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
 $rs=curl_exec($curl);
 curl_close($curl);
 if(!strpos($rs,'没有找到')){
  return 1;
 }else{
  return 0;
 }
}
add_filter( 'the_content',  'baidu_submit' );
function baidu_submit( $content ) {
 if( is_single() && current_user_can( 'manage_options') )
  if(d4v(get_permalink()) == 1)
   $content="<p align=right>百度已收录(仅管理员可见)</p>".$content;
  else
   $content="<p align=right><b><a style=color:red target=_blank href=http://zhanzhang.baidu.com/sitesubmit/index?sitename=".get_permalink().">百度未收录!点击此处提交</a></b>(仅管理员可见)</p>".$content; 
  return $content;
 }

[!--infotagslink--]

相关文章

  • mysql_connect与mysql_pconnect的区别详解

    在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • C#中out与ref的区别实例解析

    这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • SQL Server中执行动态SQL

    本文详细讲解了SQLServer中执行动态SQL的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2022-05-19
  • 谈谈Jquery中的children find 的区别有哪些

    精华:find方法能找子孙,children方法只能找儿子一、Jquery中children 语法.children(selector) 说明expr是表达式,可选参数,所有选择器中的表达式都可以用在这,比如按标签名"div",按类名".class",按序号":first"等等,如果表...2015-10-21
  • C#查询SqlServer数据库并返回单个值的方法

    这篇文章主要介绍了C#查询SqlServer数据库并返回单个值的方法,涉及C#操作SQLServer数据库查询的相关技巧,需要的朋友可以参考下...2020-06-25
  • SQL Server免费版的安装以及使用SQL Server Management Studio(SSMS)连接数据库的图文方法

    这篇文章主要介绍了SQL Server免费版的安装以及使用SQL Server Management Studio(SSMS)连接数据库的图文方法,需要的朋友可以参考下...2020-07-11
  • C#实现Excel表数据导入Sql Server数据库中的方法

    这篇文章主要介绍了C#实现Excel表数据导入Sql Server数据库中的方法,结合实例形式详细分析了C#读取Excel表数据及导入Sql Server数据库的具体操作步骤与相关操作技巧,需要的朋友可以参考下...2020-06-25
  • PS中像素大小、文档大小的区别

    在PS中像素大小、文档大小有什么区别呢,这个估计很多初学者不清楚,下面我来给大家讲解一下,希望对你有帮助。 1、像素大小 通常用于显示屏显示的图片大小的调整。菜...2016-09-14
  • C#连接到sql server2008数据库的实例代码

    这篇文章主要介绍了C#连接到sql server2008数据库的实例代码,需要的朋友可以参考下...2020-06-25
  • mysql connect to server at localhost failed错误原因分析

    mysql教程 connect to server at 'localhost' failed错误原因分析 /usr/local/webserver/mysql/bin/mysqladmin: connect to server at 'localhost' failed error: 'A...2016-11-25
  • SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息

    SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 'WIN-8IVSNAQS8T7\Administrator' 的信息,错误代码 0x534。 [SQLSTATE 42000] (ConnIsLoginSysAdmin)...2021-07-15
  • C#编程实现连接SQL SERVER数据库实例详解

    这篇文章主要介绍了C#编程实现连接SQL SERVER数据库的方法,以实例形式较为详细的分析了C#连接SQL SERVER数据库的相关步骤与具体实现技巧,需要的朋友可以参考下...2020-06-25
  • Tomcat正常访问localhost报404问题解决

    这篇文章主要介绍了Tomcat正常访问localhost报404问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
  • SQL SERVER迁移之更换磁盘文件夹的完整步骤

    这篇文章主要给大家介绍了关于SQL SERVER迁移之更换磁盘文件夹的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • CentOS8安装SQLServer2019的过程

    这篇文章主要介绍了CentOS8安装SQLServer2019的步骤,本文通过命令实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • SqlServer 数据库 三大  范式

    本文将基于三大范式原则,结合具体的实例做简要分析,对SqlServer 数据库 三大 范式相关知识感兴趣的朋友一起看看吧...2020-07-11
  • C#中sleep和wait的区别分析

    这篇文章主要介绍了C#中sleep和wait的区别分析,有助于深入理解C#中线程的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • uniapp和vue的区别详解

    这篇文章主要介绍了uniapp和vue的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-10-19