在php获取一个url地址我会使用到超级全局变量$_SERVER,他包括了各种参数获取,如HTTP_HOST、PHP_SELF、QUERY_STRING等等,这里就不介绍了。
PHP获取URL的几个函数介绍
代码如下 |
复制代码 |
<?php
//获取域名或主机地址
echo $_SERVER['HTTP_HOST']."<br>";
//获取网页地址
echo $_SERVER['PHP_SELF']."<br>";
//获取网址参数
echo $_SERVER["QUERY_STRING"]."<br>";
//来源网页的详细地址
echo $_SERVER['HTTP_REFERER']."<br>";
?>
|
把上面的几个函数组合一下,即可得到完整的URL地址
代码如下 |
复制代码 |
<?php
// 说明:获取完整URL
function curPageURL()
{
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on")
{
$pageURL .= "s";
}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80")
{
$pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
}
else
{
$pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
}
return $pageURL;
}
?>
|
定义该函数之后就可以直接调用了:
代码如下 |
复制代码 |
<?php
echo curPageURL();
?>
|
如果你的网页出现301或404对于用户体验来讲是一个非常严重的问题了,所以我们在做php header301或404时就必须小心再小心了,正同我来看看。
301跳转
代码如下 |
复制代码 |
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.abc.com/aaa/');
exit();
|
不要漏了header(‘HTTP/1.1 301 Moved Permanently’); 不然返回不了301
404错误页面
代码如下 |
复制代码 |
header("HTTP/1.1 404 Not Found");
|
如果上面的不起作用,可以试试下面的:
代码如下 |
复制代码 |
header("Status: 404 Not Found");
|
所以为了万无一失,可以两句都写上:
代码如下 |
复制代码 |
header("HTTP/1.1 404 Not Found");
header("Status: 404 Not Found");
|
小提示,
如果写好代码之后我们必须使用站长工具来测试一下返回的状态是不是我们想要的哦。
301跳转就是告诉访问者页面己经永远到了新的页面了,在php中使用301跳转我们利用header()函数发送301状态代码告诉浏览器,然后再实现页面跳转即可。
PHP纯代码跳转
代码如下 |
复制代码 |
<?php
header("Location:http://www.111cn.net/");
?>
|
但是这种返回的状态码是302
如果要实现301跳转的话,需要在之前设置下状态码
代码如下 |
复制代码 |
<?php
header( "HTTP/1.1 301 Moved Permanently" ) ;
header("Location:http://www.111cn.net/");
?>
|
更简单的PHP跳转301代码
代码如下 |
复制代码 |
<?php
$urlto='http://www.111cn.net/';
header('Location: '.$urlto, TRUE, 301);
?>
|
可能出现的问题
Warning: Cannot modify header information - headers already sent by把文件编码改成 UTF-8无BOM格式 可解决该问题,如果还是有问题,就检查下该代码前是否定义了字符串变量,删除这个变量再试试。
附:30*返回状态码的区别
301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:
1.301 redirect: 301 代表永久性转移(Permanently Moved),
2.302 redirect: 302 代表暂时性转移(Temporarily Moved ),
这两种转移在使用的时候有啥好处或者问题?
301 重定向是网页更改地址后对seo搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。
302 重定向是临时性转移。
php中移动复制文件我们使用copy,下面我们来看一个简单的实例,他实现了目录与目录文件移动,希望此文章对大家帮助。
方法一,copy+unlink方式
我的思路是:移动=新建+删除。在移动之前在目标的目录新建一个文件夹,然后在把文件和目录都复制过去,最后在执行删除.
代码如下 |
复制代码 |
/**
* @parammoveDir 剪切文件和目录
* @param string $to 目标文件路径
* @param string $from 源文件路径
*/
function moveDir($from,$to){
if(!is_dir($from)){//判断$from源文件目录是不是存在
return false;
}
$from = rtrim(str_replace(‘//’,'/’,$from), ‘/’);//为了在linux上兼容,我们把/符号全部转换成/因为windows下面2个符号都可以的.
$files = scandir($from);//列出源文件目录的文件和文件夹,并且以数组的形式存入 $files。
/*
$files的输出结果:
Array ( [0] => . [1] => .. [2] => a [3] => b [4] => c [5] => dir [6] => dir.php [7] => dir2 [8] => dir2.php [9] => function_file.php [10] => homework.php )
可以看到scandir这个函数会输出2个多余的值: [0] => . [1] => ..在这对我们木有用.写一个if干掉他们。
*/
foreach($files as $file){//对 $files数组进行遍历,方便对数组里面的文件夹和文件进行复制和删除.
if(in_array($file, array(‘.’,’..’))){// array(‘.’,’..’)新建了一个只有.和..的数组,并且查找$file里面知否有.和..这2个值
continue;
}
$subFrom = $from.’/’.$file;//把遍历后的文件夹或者文件名变成一个新的路径
$subTo = $to.’/’.$file;
if(is_dir($subFrom)){
@mkdir($subTo);//判断$subFrom是不是一个目录,如果是目录就在目标的目录下面,新建一个目录
moveDir($subFrom, $subTo);//递归执行新建目录。
}else{//不是目录的话,就直接复制文件.复制完就删除文件.
copy($subFrom, $subTo);
unlink($subFrom);//删除所有文件
}
@rmdir($subFrom);//删除所有的目录
}
return true;
}
moveDir(‘C:/Users/Administrator/Desktop/0704′,’e:’);//在这传递你要移动的文件或者目录的地址
|
方法二,rename
1.对于文件,rename可以在不同盘符之间移动.
2.对于空文件夹,rename也可以在不同盘符之间移动.但是目标文件夹的父目录必须存在.
3.对于非空文件夹,只能在同一盘符下移动.不过,1和3,应该差不多能够对付所有的应用情况了.
代码如下 |
复制代码 |
<?php
rename("D:/testdir/test","F:/totestdir/mydir");
?>
|
对于一个40M的文件,copy+unlink方式需要7.6249899864197秒,而rename方式,只需要0.024738788604736,快300倍.
例
代码如下 |
复制代码 |
<?php
//定义一个变量,保存文件名
$file = "html/cache.txt";
$rename = "html/renameCache.txt";
//使用rename()函数重命名一个文件
if(rename($file,$rename)==TRUE){
echo "重命名文件成功!";
}else{
echo "重命名文件失败!";
}
//使用rename()函数移动文件,并改名
rename("html/renameCache.txt","html/a/2.txt");
//使用rename()函数重命名目录
rename("html","cache");
//使用rename()函数移动目录到目标目录
rename("b","cache/b");
?>
|
这个文件下载实例做得非常的详细他是结合header函数与while fread函数把文件分断读出来然后再发送到客户端了,算得上一个标准的文件下载实例。
一个PHP文件下载的小实例
/*======================================================
$FileName 为文件名称,必传
$FilePath 为文件路径.选填,可以为相对路径或者绝对路径
路径只能由英文跟数据组成,不能带有中文
如有问题 欢迎联系博主指出
======================================================*/
代码如下 |
复制代码 |
<?php
header("Content-type: text/html;charset=utf-8");
if(strlen($FileName)<=3){echo "下载失败:你所以下载的文件信息有误";return;}
$FileName=iconv("utf-8","gb2312",$FileName);//进行文件名格式转换,以防中文乱码
//开始判断路径
if(!is_null($FilePath)&&strlen($FilePath)>1){
if(substr($FilePath,0,1)=='/'){//判断是否为绝对路径
$FilePath=$_SERVER['DOCUMENT_ROOT'].$FilePath;
}
if(substr($FilePath,-1)!="/"){//检查最后是否为 / 结尾
$FilePath=$FilePath.'/';
}
if(is_numeric(strpos($FilePath,":\"))){//检查是否为绝对路径
$FilePath=str_replace("/","\",$FilePath);
}
}elseif(strlen($FilePath)==1&&$FilePath!="/"){
$FilePath=$FilePath."/";
}else{
$FilePath="";
}
if(!file_exists($FilePath.$FileName)){
echo"下载失败:所要下载的文件未找到";return;
}
/*================================================
发送下载相关的头部信息
=================================================*/
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");//按照字节大小返回
header("Accept-Length: $FileSize");//返回文件大小
header("Content-Disposition: attachment; filename=".$FileName);//这里客户端的弹出对话框,对应的文件名
/*================================================
开始下载相关
=================================================*/
$FileSize=filesize($FilePath.$FileName);
$File=fopen($FilePath.$FileName,"r");//打开文件
$FileBuff=512;
while($FileSize>=0){
$FileSize-=$FileBuff;
echo fread($File,$FileBuff);
}
fclose($File);
}
?>
|
总结
本下载实例并且支持中文文名了,在文件开头就进行了uft8编码转换了。
标签:[!--infotagslink--]