PHP实反向代理-收藏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP实反向代理-收藏相关的知识,希望对你有一定的参考价值。

需求 

  现在有些后辍的域名不支持备案,这个时候需要用免备案主机或空间做个反向代理,这样可实现内容存放在国内主机统一管理

实现

  用 php-dynamic-mirror 可实现,并在头部进行域名转换,可实现多个域名反向代理到不同的站点,一共两个文件简单方便,做个收藏

  index.php

  

<?php
$domain = $_SERVER[‘SERVER_NAME‘];
$mirror = "www.mz.cn";
switch ($domain)
{
case "www.a.cn":
  $mirror = "www.az.cn";
  break;
case "www.b.com.cn":
  $mirror = "www.bz.com";
  break;
default:
  $mirror = "www.mz.cn";
}

$req = $_SERVER[‘REQUEST_METHOD‘] . ‘ ‘ . $_SERVER[‘REQUEST_URI‘] . " HTTP/1.0\\r\\n";
$length = 0;
foreach ($_SERVER as $k => $v) {
    if (substr($k, 0, 5) == "HTTP_") {
        $k = str_replace(‘_‘, ‘ ‘, substr($k, 5));
        $k = str_replace(‘ ‘, ‘-‘, ucwords(strtolower($k)));
        if ($k == "Host")
            $v = $mirror;                        # Alter "Host" header to mirrored server
        if ($k == "Accept-Encoding")
            $v = "identity;q=1.0, *;q=0";        # Alter "Accept-Encoding" header to accept unencoded content only
        if ($k == "Keep-Alive")
            continue;                            # Drop "Keep-Alive" header
        if ($k == "Connection" && $v == "keep-alive")
            $v = "close";                        # Alter value of "Connection" header from "keep-alive" to "close"
        $req .= $k . ": " . $v . "\\r\\n";
    }
}
$body = @file_get_contents(‘php://input‘);
$req .= "Content-Type: " . $_SERVER[‘CONTENT_TYPE‘] . "\\r\\n";
$req .= "Content-Length: " . strlen($body) . "\\r\\n";
$req .= "\\r\\n";
$req .= $body;

#print $req;

$fp = fsockopen($mirror, 80, $errno, $errmsg, 30);
if (!$fp) {
    print "HTTP/1.0 502 Failed to connect remote server\\r\\n";
    print "Content-Type: text/html\\r\\n\\r\\n";
    print "<html><body>Failed to connect to $mirror due to:<br>[$errno] $errstr</body></html>";
    exit;
}

fwrite($fp, $req);

$headers_processed = 0;
$reponse = ‘‘;
while (!feof($fp)) {
    $r = fread($fp, 8192);
    if (!$headers_processed) {
        $response .= $r;
        $nlnl = strpos($response, "\\r\\n\\r\\n");
        $add = 4;
        if (!$nlnl) {
            $nlnl = strpos($response, "\\n\\n");
            $add = 2;
        }
        if (!$nlnl)
            continue;
        $headers = substr($response, 0, $nlnl);
        $cookies = ‘Set-Cookie: ‘;
        if (preg_match_all(‘/^(.*?)(\\r?\\n|$)/ims‘, $headers, $matches))
            for ($i = 0; $i < count($matches[0]); ++$i) {
                $ct = $matches[1][$i];
#                if (substr($ct, 0, 12) == "Set-Cookie: ") {
#                    $cookies .= substr($ct, 12) . ‘,‘;
#                    header($cookies);
#                } else
                    header($ct, false);
#                print ‘>>‘ . $ct . "\\r\\n";
            }
        print substr($response, $nlnl + $add);
        $headers_processed = 1;
    } else
        print $r;
}
fclose ($fp);
?>

.htaccess

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
</IfModule>

文件

  文件下载

 

以上是关于PHP实反向代理-收藏的主要内容,如果未能解决你的问题,请参考以下文章

nginx反向代理服务器域名解析配置实操

六祎-Nginx反向代理和负载均衡配置实操演练

Nginx——反向代理 & 负载均衡(无理论,案例实操)

Nginx——反向代理 & 负载均衡(无理论,案例实操)

PHP反向代理-百度图片

反向代理实现同域名下PHP和Java共存