使用开源 PHP 项目反向代理网站

0、前言

对于一些网站上的资源,直接调用容易引发跨域问题,而且还需要考虑对方设置的防盗链,因此可以使用反向代理,将访问域名换成自己的。

然而,部分网站设置了某些规则,无法直接用NGINX反代,因此采用jshensh的phpReverseProxy项目。

1、关于此项目

已支持的功能:

  • 转发用户的 GET 请求
  • 转发用户的 POST 请求
  • 转发用户的 PUT 请求
  • 转发用户的 DELETE 请求
  • 转发用户发送的所有 Header(除 Accept-Encoding 和 Host)
  • 转发服务器返回的所有 Header(除 Content-Length 和 Content-Encoding)
  • 替换服务器返回的内容

2、搭建

网站目录下拉取项目:

Bash
1
git clone https://github.com/jshensh/phpReverseProxy

如果访问GitHub也困难,参考本站文章:

搭建GitHub镜像站
https://blog.tsinbei.com/archives/152/

安装依赖:

Bash
1
composer require jshensh/php-curl-class

3、配置

替换index.php第六行的源站访问协议、第七行的源站域名、第八行的当前站点域名。

从154行开始的输出替换数组按实际情况修改。

例如:

PHP
1
2
3
$originProtocol = 'https';
$originSite     = 'a.com';
$thisSite       = 'b.com';

即可反向代理https://a.com,而b.com的访问协议可在宝塔中自定义,不在此处设置。

如果需要支持默认文件,例如index.html,可以加入一行:

PHP
1
$_SERVER['REQUEST_URI']=str_replace('index.html','',$_SERVER['REQUEST_URI']);

即回源时,把请求URI中的index.html去掉。在一些默认文件不是index.html,但是可以通过根目录访问的网站,这个方法奏效。

该程序默认把目标网站替换成自己的网站,例如反向代理a.com,其中的a.com会被修改为b.com再返回。如果需要添加其他替换,可以按照以下示例修改:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
try {
    new ReverseProxy([
        'replace' => [
            [
                $originSite,
                '[email protected]'
            ], [
                $thisSite,
                '[email protected]'
            ]
        ],
        'originProtocol' => $originProtocol,
        'originSite' =>$originSite,
        'thisSite' => $thisSite
    ]);
} catch (\Exception $e) {
    echo '<h1>Proxy Error</h1><p>' . $e->getMessage() . '</p>';
}

示例中,将把[email protected]替换成[email protected]

4、伪静态

伪静态规则:

此处内容需要评论回复(自动审核)或加入 QQ 技术交流群(立即获得内容)后方可阅读。赞助(二维码在文章下方)后联系作者可一次性解锁所有(包括之后的新文章)。

使用开源 PHP 项目反向代理网站

https://blog.tsinbei.com/archives/886/

文章作者
Hsukqi Lee
发布于

2022-09-18

修改于

2022-12-13

许可协议

CC BY-NC-ND 4.0

评论

昵称
邮箱
网址
6 条

qiurigao105

qiurigao105

好东西,能带日志更好了。记录请求和返回

  回复

qiurigao

qiurigao

感谢刚好需要

  回复

sunteeta

sunteeta

麻烦分享一下

  回复

sexxx

sexxx

请问能不能分享一下。。谢谢了

  回复

Omini

Omini

谢谢分享,看一下

  回复

神奇

神奇

谢谢分享,刚好需要

  回复