2011-07-07 197 views
11

私は2つのPHPページを持っています。私はa.phpでb.phpを取得したい。私a.phpでcurlを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の下にあると確信しています。

curlが相対パスで動作できないのはなぜですか?回避策はありますか?

+2

最初は相対パスをcURLするのは絶対に意味がありません。それがうまくいくと思う理由を説明できますか?それはどのように機能しますか?回避策として、 'a.php'への完全なURLを作成し、それを渡してください。 – BoltClock

+0

私はそれがjavascriptでXMLHTTPRequestとして動作し、相対パスを受け入れるべきだと思います。 –

+1

JavascriptのXMLHTTPRequestは現在のベースURLを知っています。あなたがそれを伝えるために最小限の努力をしない限り、cURLはしません。それがcurl_initの目的です。 – mario

答えて

13

カールは、ウェブサーバーとその理由(Webページ)と、そこにある理由(哲学的)についてはまったく知らない別のライブラリです。

$_SERVER['SERVER_NAME'] 

現在のスクリプトが実行されているサーバのホスト名:だから、2つの_SERVER変数の1つを使用して「偽」相対URLがあります。スクリプトが仮想ホスト上で実行されている場合、これはその仮想ホストに定義された値になります。ホストの

$_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を参照してください。

相対URIに基づいて絶対URIを構築することができるPHPクラスで、基数はPearの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

CURLは、その動作環境の全く知識がありません。 'b.php'がどこにあるかを知る方法はありません。それをexample.org/b.phpまたはsome.wonky.multi.level.domain.co.uk/b.phpにする必要がありますか?

ローカルファイル参照として扱っても役に立たないでしょう... CURLは.phpファイルが実際にはPHPスクリプトであることを知りません。ローカルのファイルをフェッチしたとしても、PHPを実行した後のスクリプトの出力ではなく、PHPのソースを取得するだけです。 arstechnica.comのようなサイトがあり、すべてのページが実際に.arsのスクリプトである場合はどうなりますか?それは.aspですか? .aspx? .html? PHPスクリプト? perl?ルビー?

だから簡単な答え:CURLを操作するには、プロトコルを使用して完全なURLを指定する必要があります。

関連する問題