【问题标题】:PHP HTTP Proxy ServerPHP HTTP 代理服务器
【发布时间】:2023-03-29 07:49:02
【问题描述】:

有谁知道作为代理服务器运行的 PHP 脚本(不使用像 Apache 这样的网络服务器)?我正在寻找一个基于 PHP 的,所以我可以编辑/修改通过它的流量(出于安全原因)。我发现的最接近的东西是 philtron (http://philtron.sourceforge.net/),但这似乎是一个过时的项目,不再适用于 PHP5。

【问题讨论】:

  • PHP 不会完全是我实现完整服务器的首选,所以我想说你找到一个的机会可能很小。
  • 是的。请看下面我的回答。使用内置的 Web 服务器在 PHP 中实现 http 代理非常简单。然后,您可以像使用 philtron 一样修改页面,但使用更新的技术来解析和操作数据。 . .像 PHP:DOMDocument,通过 node 传递 javascript 并用 esprima 进行转换,用 html tidy 清理 html 等等。
  • Here is a simple script,通过代理的 HTTPS 对话工作。我有this library working too,但仅限于HTTP 模式,而我正在寻找CONNECT 支持。后者看起来更稳定且经过测试,但我猜它不能作为 HTTPS 代理运行。

标签: php proxy


【解决方案1】:

您可以使用Nanoweb,这是一个用 PHP 实现的 Web 服务器。它带有mod_proxy。尽管操纵流量需要更多的代码更改。它不是为此而设计的。 OTOH,它是您能找到的最符合 HTTP/1.1 的 PHP 解决方案。

【讨论】:

    【解决方案2】:

    我不是 PHP 专家,我确​​信可以用 PHP 实现 web 服务器,但不是这样。如果您不想使用 Apache,请尝试使用 nginx(轻量级、易于更改等)。

    不过,我认为您的要求很奇怪。这就像说你想用汇编语言编写一个 HTML 页面。可行但不是最好的方法。如果您需要像代理这样可以嗅探流量的东西,您应该使用haproxy 并根据您的需要进行修改。

    【讨论】:

      【解决方案3】:

      我也需要一个用 PHP 编写的 HTTP 代理,以便我可以将它集成到需要与未实现 CORS 的 3rd 方服务器交互的项目中。

      这是我的结果。该脚本使用 PHP-7.4 进行了测试。

      <?php
       $target = substr($_SERVER["REQUEST_URI"], strlen($_SERVER["SCRIPT_NAME"]));
       $url = "http://localhost:8008$target"; 
       $req = curl_init();
       curl_setopt($req, CURLOPT_URL, $url);
      
       function handler_header($req, $header)
       {
         header($header);
         return strlen($header);
       }
      
       curl_setopt($req, CURLOPT_HEADERFUNCTION, "handler_header");
       curl_setopt($req, CURLOPT_CUSTOMREQUEST, $_SERVER["REQUEST_METHOD"]);
      
       $hdr = [];
      
       $prefix = "HTTP_";
       $conn = "HTTP_CONNECTION";
       $connopt = $_SERVER[$conn] ?? "";
       $connopts = explode(",", $connopt);
       foreach( $connopts as &$opt )
       {
         $opt = trim($opt);
         $opt = strtoupper($opt);
         $opt = preg_replace('/[^[:alnum:]]/', "_", $opt);
       }
      
       foreach( $_SERVER as $k => $v )
       {
         if( substr($k, 0, strlen($prefix)) !== $prefix ) continue;
         if( $k === "HTTP_HOST" ) continue;
      
         $i = 0;
         for($i=0; $i<count($connopts); $i++)
           if( "HTTP_".$connopts === $k ) break;
         if( $i < count($connopts) ) continue;
      
         $hdr[] = strtr(substr($k, strlen($prefix)), "_", "-").": $v";
       }
      
       curl_setopt($req, CURLOPT_HTTPHEADER, $hdr);
      
       curl_exec($req);
      

      您可以使用curl_setopt注册不同的回调来捕获和修改请求和响应。

      【讨论】: