php curl的CURLOPT_FOLLOWLOCATION選項報錯

問題

程序報錯:
CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set

http頭的location字段

location字段出現在服務響應包裏面,意思是當前請求的數據挪地方了,請再次請求location對應的地址獲取數據。

curl的CURLOPT_FOLLOWLOCATION選項

curl的這個選項,意思是跟隨location字段(如果有的話),遞歸直到真實數據返回回來。

問題解決

safe_mode:PHP安全模式,當開啓時一些PHP函數將被禁用
open_basedir: 將用戶訪問文件的活動範圍限制在指定的區域 如 open_basedir=.:/tmp 或是具體 /var/tmp
以上兩個配置都在php.ini中設定。關於問題,可以修改配置,或者在curl代碼那裏這樣寫:

if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {

    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);

}

php安全模式

php安全模式:safe_mode=on|off
啓用safe_mode指令將對在共享環境中使用PHP時可能有危險的語言特性有所限制。可以將safe_mode是指爲布爾值on來啓用,或者設置爲 off禁用。它會比較執行腳本UID(用戶ID)和腳本嘗試訪問的文件的UID,以此作爲限制機制的基礎。如果UID相同,則執行腳本;否則,腳本失敗。
具體地,當啓用安全模式時,一些限制將生效。
1、所有輸入輸出函數(例如fopen()、file()和require())的適用會受到限制,只能用於與調用這些函數的腳本有相同擁有者的文件。例如,假定啓用了安全模式,如果Mary擁有的腳本調用fopen(),嘗試打開由Jonhn擁有的一個文件,則將失敗。但是,如果Mary不僅擁有調用 fopen()的腳本,還擁有fopen()所調用的文件,就會成功。
2、如果試圖通過函數popen()、system()或exec()等執行腳本,只有當腳本位於safe_mode_exec_dir配置指令指定的目錄纔可能。
3、HTTP驗證得到進一步加強,因爲驗證腳本用於者的UID劃入驗證領域範圍內。此外,當啓用安全模式時,不會設置PHP_AUTH。
4、如果適用MySQL數據庫服務器,鏈接MySQL服務器所用的用戶名必須與調用mysql_connect()的文件擁有者用戶名相同。
安全模式和禁用的函數
下面是啓用safe_mode指令時受影響的函數、變量及配置指令的完整列表:
apache_request_headers() backticks()和反引號操作符 chdir()
chgrp() chmode() chown()
copy() dbase_open() dbmopen()
dl() exec() filepro()
filepro_retrieve() filepro_rowcount() fopen()
header() highlight_file() ifx_*
ingres_* link() mail()
max_execution_time() mkdir() move_uploaded_file()
mysql_* parse_ini_file() passthru()
pg_lo_import() popen() posix_mkfifo()
putenv() rename() zmdir()
set_time_limit() shell_exec() show_source()
symlink() system() touch()

以下是一些和安全模式相關的配置選項
safe_mode_gid=on|off
次指令會修改安全模式的行爲,即從執行前驗證UID改爲驗證組ID。例如,如果Mary和John處於相同的用戶組,則Mary的腳本可以對John的文件調用fopen()。
safe_mode_include_dir=string
可以使用指令safe_mode_include_dir指示多個路徑,啓用安全模式時在這些路徑中將忽略安全模式。例如,你可以使用此函數指定一個包含不同模板的目錄,致謝模板可能會繼成到一些用戶網站。可以指定多個目錄,在基於UNIX的系統各目錄用冒號分隔,在Windows中用分號分隔。
注意,如果指定某個路徑但未包含最後的斜線,則該路徑下的所有目錄都會忽略安全模式設置。例如,如果設置次指令爲/home /configuration,表示/home/configuration/templates/和/home/configureation /passwords都排除在安全模式限制之外。因此,如果只是要排除一個目錄或一組目錄不受安全模式設置的限制,要確保每個目錄都包括最後的斜線。
safe_mode_env_vars=string
當啓用安全模式時,可以只用次指令允許執行用戶的腳本修改某些環境變量。可以允許修改多個變量,每個變量之間用逗號分隔。
safe_mode_exec_dir=string
次指令指定一些目錄,其中的系統程序可以通過諸如system()、exec()或passthru()等函數執行。爲此必須啓用安全模式。此指令有一個奇怪的地方,在所有操作系統中(包括Windows),都必須使用斜線(/)作爲目錄的分隔符。
safe_mode_protected_env_vars=string
此指令保護某些環境變量不能被putenv()函數修改。默認情況下,變量LD_LIBRARY_PATH是受保護的,因爲如果在運行時修改這個變量可能導致不可預知的結果。關於此環境變量的更多信息,請參考搜索引擎或Linux手冊。注意,本屆中聲明的所有便來弄個都覆蓋 safe_mode_allowed_env_vars指令中聲明的變量。

另外,由於啓用了安全模式後,由於會對比文件的擁有者和文件的執行者是否是一個人,所以會減慢執行效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章