2014-07-07 30 views
-1

在服務器A上託管一個網站。該主機是一臺功能有限的共享主機。然後,有一個專用的第二臺服務器,並具有所有必需的功能和能力。將客戶端的請求重定向到第二臺服務器以獲取服務器並返回到第一臺服務器

我想將客戶端請求原樣重定向到第二個服務器,以便將其發送,處理,然後將所需信息發送回服務器。這裏是場景:

1-用戶發送請求www.site.com 2- www.site.com接收請求,發送客戶端信息到第二臺服務器與另一個域,例如mysecondsite。 com,並收到一些數據包。 3- site.com使用從mysecondsite.com返回的數據呈現頁面(或提供請求)

這可能應該用APACHE完成,因爲我需要在PHP處理之前發送請求,因爲我想某些原始信息將被髮送。

現在,對於那些可能會好奇的人,爲什麼我應該這樣做?

如您所知,我安裝了一些擴展工具或工具,用於執行某些共享主機從未安裝或允許的操作。我有一個專用的服務器,它被許多工具和擴展優化。例如,假設我已經編寫了一個PHP擴展,它爲用戶請求提供服務,並提供有關其代理,版本,操作系統等的一系列信息。使用上述方案,然後將信息信息從我的專用服務器發送回請求的源服務器。

上述示例僅適用於主機爲專用的情況。在許多情況下,我的客戶不是。

回答

2

我沒有類似的東西,並用它捲曲:

$url = "http://secondserver.com?p=SOMESECRET"; 

    $post['data[expire]'] = '2014-07-04'; 
    $post['data[date]']= date("d.m.Y", time()); 
    $post['data[count]']= $data['count']; 

    //initialize session 
    $ch = curl_init($url); 

    //the generated pdf from the external server 
    $tmppdf = tempnam($_SERVER['DOCUMENT_ROOT']."/cache/","pdf"); 
    $fp = fopen($tmppdf, "a+b"); 

    //session options 
    curl_setopt($ch, CURLOPT_FILE, $fp); 
    curl_setopt($ch,CURLOPT_POST,true); 
    curl_setopt($ch,CURLOPT_POSTFIELDS,$post); 
    //curl_setopt($ch, CURLOPT_HEADER, false); 

    //execute the request 
    curl_exec($ch); 

    //close the session and filepointer 
    curl_close($ch); 
    fclose($fp); 

,並在服務器第二服務器端:

$privateKey = "SOMESECRET"; 
    if($privateKey != $_GET['p']) return; 

    $yourPassedData = $_POST['data']; 

和你做。

附加:

如果您想直接服務從您可以使用以下組合的另一臺服務器的響應:

$post['data[headers]'] = getallheaders(); 

    //initialize session 
    $ch = curl_init($url); 

    curl_setopt($ch, CURLOPT_POST,true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS,$post); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    $response = curl_exec($ch); 
    curl_close($ch); 

    return $response; 

對於要取請求頭的部分,請參考:

http://php.net/manual/en/function.getallheaders.php

+0

儘管您的解決方案在許多情況下確實非常方便,但在某些特殊情況下,我需要通過優化的PHP來提供請求,這意味着我需要將請求從第一臺服務器的apache傳遞到第二臺服務器的PHP是優化的),因爲PHP的第一臺服務器缺少所需的擴展/功能 –

+0

好吧,我想我明白你的問題。您想要分析請求的http頭並從優化的服務器發送相應的響應。 也許你可以將你的頭部作爲有效載荷傳遞給其他服務器並在那裏處理這些東西? –

+0

我需要更多的解釋從你身邊。你能編輯你的答案嗎?另外還有一些mod_proxy的考慮 –

0

我認爲Apache的mod_rewrite模塊沒有在這種情況下工作,因爲喲你不能轉發到另一個域,而不會讓客戶端看到它。

但是,你可以 簡單

  • 收到第一臺服務器上請求
  • 使用PHP的file_get_contents()功能,採用包括所有所必需的特殊要求
  • 解析信息的URL請求在第二臺服務器上並回應響應,例如JSON格式
  • 解析第一臺服務器上請求的響應

相反,如果file_get_contents(),你也可以使用PHP的捲曲(如果第一個服務器上可用),因爲它更靈活,並提供了更多的可能性。

+0

你能詳細說明嗎?如何處理file_get_contents? –

+0

實際上,我會推薦CURL版本(參見其他答案),但是關於'file_getContents()':www.site1.com收到一個調用PHP腳本的請求。在PHP腳本中,您從請求中收集適當的信息並生成到第二個服務器的新URL,例如'$ result = json_decode(file_get_contents(www.site2.com/jsonrequest/?a=b&c=d&so=on));'。 (您只能使用此方法執行GET請求。對於POST請求,您肯定需要CURL。) – Jan

相關問題