我一直在网上寻找 PHP 代理脚本,但找不到任何东西。我一直在寻找的只是下载页面和编辑 HTML 中的属性的脚本,src
并且href
要求我浏览到安装它们的任何网站。我不需要这个,我需要一个真正的代理监听一个端口,我可以设置我的浏览器将它的所有请求路由到。
我要做的是:
- 运行一个 PHP 脚本来监听我自己电脑的某个端口
- 将我的网络浏览器配置为使用 localhost:port 作为代理
- 让 PHP 脚本将页面提供给我的浏览器
如果请求的页面用于获取内容,那么我发现的所有用 PHP 编写的所谓代理脚本都会失败,XMLHttpRequest
因为它们根本看不到该请求。除了注入一些真正代理不需要的巧妙 JavaScript 之外,再多的链接重写都无法解决问题。
我最终想要的是访问在我的浏览器和某个远程服务器之间来回传输的请求和响应。我希望能够使用我的浏览器对 JavaScript、cookie、flash 等的支持。基本上,我希望以编程方式访问所有通信,以便我可以使用 PHP 分析或操作它。
所以,问题是
- 我是否因为搜索结果中的所有噪音而错过了用 PHP 实现的真正代理?
- 如果 PHP 中没有真正的代理,我想尝试制作一个。是否有在线资源可以帮助我了解我应该做什么?(注意,我虔诚地 RTM:寻找更多关于基本代理的警告和架构)
链接表示赞赏。我知道那里有几个 MITM 代理,但我想要一个 PHP 代理。
我不知道我是否可以用PHP 的内置网络服务器做点什么,但我也会搞砸的。
更新
我有一个用于内置网络服务器的 PHP 的路由器脚本,它开始显示出前景。我可以启动网络服务器并告诉我的网络浏览器将其用作代理。我制作的路由器脚本区分了本地资源和外部资源,并提供了一种处理这两种情况的简单方法。我唯一的问题是https。服务器报告Invalid Request (Malformed HTTP Request)
。我认为这意味着该服务器根本不会仅使用脚本和设置来执行 https。我不知道。也许我可以用 Apache 来做到这一点,但透明地代理 https 听起来很难,特别是如果我想在数据到达我的浏览器之前更改它。
AtropaToolbox/php_router/router.php 指向 我的 PHP 内置网络服务器的路由器脚本,从其他文件中提取实际类。
<?php
require_once('AtropaToolbox/php_proxy/proxy.php');
$proxy = new atropa_proxy();
if($proxy->process_request() === false) {
return false;
}
?>
AtropaToolbox/php_proxy/proxy.php 扩展 atropa_mod_proxy 以重新定义处理程序。
<?php
require_once('AtropaToolbox/php_proxy/mod_proxy.php');
class atropa_proxy extends atropa_mod_proxy
{
protected function local_resource_handler() {
return false;
}
protected function external_resource_handler() {
$ext = $this->get_page();
//echo '<pre>' . print_r($ext, true) . '</pre>';
//$ext['page'] = preg_replace('/<a /', '<p ', $ext['page']);
$this->show_page($ext);
}
}
?>
AtropaToolbox/php_proxy/mod_proxy.php 通用路由器脚本
<?php
/**
* Rev. 1 Atropa mod_proxy for php built in webserver
*/
class atropa_mod_proxy
{
protected function is_external_resource() {
$host = parse_url($_SERVER['REQUEST_URI'], PHP_URL_HOST);
if(isset($host) && $host !== $_SERVER['SERVER_NAME']) {
return true;
} else {
return false;
}
}
protected function local_resource_handler() {
return false;
}
protected function external_resource_handler() {
$ext = $this->get_page();
$this->show_page($ext);
}
public function process_request() {
if($this->is_external_resource()) {
return $this->external_resource_handler();
} else {
return $this->local_resource_handler();
}
}
public function get_request_headers() {
$arr = array();
foreach($_SERVER as $svar => $sval) {
if(substr($svar, 0, 4) === 'HTTP') {
$svar = substr($svar, 5);
$svar = preg_replace('/_/', ' ', $svar);
$svar = ucwords(strtolower($svar));
$svar = preg_replace('/ /', '-', $svar);
$arr[$svar] = $sval;
}
}
return $arr;
}
public function pack_request_headers($headers_array) {
$packed = '';
foreach($headers_array as $header_name => $header_value) {
$packed .= $header_name . ': ' . $header_value . "\r\n";
}
return $packed;
}
public function echo_response_headers($http_response_header_array) {
foreach($http_response_header_array as $val) {
if(strpos(strtolower($val), 'connection') !== 0) {
header($val);
}
}
}
protected function get_page() {
$request_headers = $this->get_request_headers();
$request_headers = $this->pack_request_headers($request_headers);
$method = $_SERVER["REQUEST_METHOD"];
$scheme = parse_url($_SERVER['REQUEST_URI'], PHP_URL_SCHEME);
$opts = array(
$scheme => array(
'method' => $method,
'header' => $request_headers
)
);
if(count($_POST) > 0) {
$content = http_build_query($_POST);
$opts[$scheme]['content'] = $content;
}
$context = stream_context_create($opts);
$ext = array();
$ext['page'] = file_get_contents($_SERVER['REQUEST_URI'], false, $context);
$ext['http_response_header'] = $http_response_header;
return $ext;
}
protected function show_page($ext) {
header_remove();
$this->echo_response_headers($ext['http_response_header']);
echo $ext['page'];
}
}
?>