2011-07-07 94 views
11

我有兩個php頁面。我想在a.php中獲取b.php。是否可以在PHP中使用相對路徑的curl?

在我a.php只會:

$ch = curl_init("b.php"); 
echo(curl_exec($ch)); 
curl_close($ch); 

不工作;

但是:

$ch = curl_init("www.site.com/b.php"); 
echo(curl_exec($ch)); 
curl_close($ch); 

是OK。我確定a.php在www.site.com下。

爲什麼捲曲不能用相對路徑工作?有沒有解決方法?

+2

首先捲曲相對路徑絕對沒有意義。你能解釋爲什麼你認爲它應該工作嗎?它將如何工作?作爲一種解決方法,只是構建完整的URL到'a.php'並通過。 – BoltClock

+0

我認爲它應該作爲XMLHTTPRequest在javascript中接受相對路徑。 –

+1

Javascript中的XMLHTTPRequest知道當前的基礎URL。 cURL不會除非你盡最大努力去告訴它。這就是'curl_init'的用途。 – mario

回答

13

捲曲是一個單獨的庫,它並沒有真正瞭解網絡服務器,並在那裏的來自或(philosophicaly)什麼,爲什麼它的存在。所以,你可以用兩個_SERVER變量中的一個「假」相對URL:

$_SERVER['SERVER_NAME'] 

下當前運行腳本所在服務器主機的名稱。如果腳本在虛擬主機上運行,​​則這將是爲該虛擬主機定義的值。

$_SERVER['HTTP_HOST'] 

主機的內容:從當前請求頭,如果存在一個。

參見:http://php.net/manual/en/reserved.variables.server.php

編輯更新: 我思考了一下長這一點:你真的需要用捲曲去取呢? 通常你也可以獲取這樣一個腳本的任何輸出和保存通過新的HTTP請求加載它的開銷:

ob_start(); 
require "b.php"; 
$output = ob_get_clean(); 
4

cUrl需要絕對URI進行操作。

相對URI不起作用,因爲沒有給出該相對URI是絕對的基URI。然而,如果您同時擁有基本URI和相對URI,則可以創建相對URI的絕對URI並將其與cUrl一起使用。

參見12.4.1 Resolving relative URIs

PHP類可以基於相對URI構建絕對URI,它的基礎是梨中的Net_URL2包。

3

cURL主要用於從外部域中檢索數據,因此允許相對路徑沒有太大意義。最簡單的事情就是將當前域添加到URL中。

$domain = $_SERVER['HTTP_HOST'] . "/"; 
$ch = curl_init($domain . "b.php"); 
echo(curl_exec($ch)); 
curl_close($ch); 
14

如何從HTTP_HOST獲取域名?

$domain = $_SERVER['HTTP_HOST']; 
$prefix = $_SERVER['HTTPS'] ? 'https://' : 'http://'; 
$relative = '/b.php' 
$ch = curl_init($prefix.$domain.$relative) 
+1

也會檢查$ _SERVER ['HTTPS'] – wonk0

1

捲曲絕對沒有其操作環境的知識。它無法知道'b.php'在哪裏。它應該把它變成example.org/b.phpsome.wonky.multi.level.domain.co.uk/b.php

即使將它視爲本地文件引用也是無用的...... CURL不會知道.php文件實際上是一個PHP腳本。即使它執行了本地文件獲取,您只需獲取PHP源代碼,而不是PHP運行後的腳本輸出。如果你有一個類似arstechnica.com的網站,那麼它的所有頁面實際上都是.ars腳本?那是.asp? .ASPX? HTML嗎? PHP腳本? Perl的?紅寶石?

所以..簡單的答案:您必須始終指定一個完整的URL和協議,供CURL操作。

相關問題