PHP,如何重定向/转发带标头和正文的 HTTP 请求?

2024-01-07

我有一个 PHP 页面 main.php,位于服务器 1 上。

我在服务器 2 上有一个 PHP 页面 main.php (同一页面,不同的代码)。

main.php 是一个 Web 服务。

我想转发对服务器 1、服务器 2 发出的完整 HTTP 请求, 这样,当用户向 main.php(服务器 1)发送 HTTP 请求时,它将从服务器 2 上的 main.php 获得响应。

我希望向服务器 2 发出的请求与向服务器 1 发出的原始请求完全相同。

我通过以下方式获取 Http 请求数据:

$some_param  = $_REQUEST['param']
$body =file_get_contents('php://input');

可以说我有

$server1_url = "11111";
$server2_url = "22222";

这样做的动机是,我有一个生产服务器和一个临时服务器,我想将一些流量引导到新服务器以测试临时服务器上的新功能。

如何使用所有数据重定向请求或“克隆”完整请求,将其发送到新服务器并返回新响应?

感谢您的帮助!

p.s 我尝试使用 php curl,但我不明白它是如何工作的,我也找到了各种答案,但没有一个转发请求参数和正文。

再次感谢!


如果您有权访问 Apache 服务器配置,您可以使用以下设置创建虚拟主机:

ProxyPreserveHost Off
ProxyPass / http://remotesite.domain.tld/
ProxyPassReverse / http://remotesite.domain.tld/
ProxyPassReverseCookieDomain remotesite.domain.tld proxysite.tld

您需要为此启用 mod_proxy 和 mod_proxy_http。 将remotesite.domain.tld 替换为您转发到的站点,并将proxysite.tld 替换为转发器。

如果您无权访问服务器配置文件,您仍然可以在 php 中手动设置curl 并转发所有内容。

<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

/* Set it true for debugging. */
$logHeaders = FALSE;

/* Site to forward requests to.  */
$site = 'http://remotesite.domain.tld/';

/* Domains to use when rewriting some headers. */
$remoteDomain = 'remotesite.domain.tld';
$proxyDomain = 'proxysite.tld';

$request = $_SERVER['REQUEST_URI'];

$ch = curl_init();

/* If there was a POST request, then forward that as well.*/
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);
}
curl_setopt($ch, CURLOPT_URL, $site . $request);
curl_setopt($ch, CURLOPT_HEADER, TRUE);

$headers = getallheaders();

/* Translate some headers to make the remote party think we actually browsing that site. */
$extraHeaders = array();
if (isset($headers['Referer'])) 
{
    $extraHeaders[] = 'Referer: '. str_replace($proxyDomain, $remoteDomain, $headers['Referer']);
}
if (isset($headers['Origin'])) 
{
    $extraHeaders[] = 'Origin: '. str_replace($proxyDomain, $remoteDomain, $headers['Origin']);
}

/* Forward cookie as it came.  */
curl_setopt($ch, CURLOPT_HTTPHEADER, $extraHeaders);
if (isset($headers['Cookie']))
{
    curl_setopt($ch, CURLOPT_COOKIE, $headers['Cookie']);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

if ($logHeaders)
{
    $f = fopen("headers.txt", "a");
    curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
    curl_setopt($ch, CURLOPT_STDERR, $f);
}

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $header_size);
$body = substr($response, $header_size);

$headerArray = explode(PHP_EOL, $headers);

/* Process response headers. */
foreach($headerArray as $header)
{
    $colonPos = strpos($header, ':');
    if ($colonPos !== FALSE) 
    {
        $headerName = substr($header, 0, $colonPos);
        
        /* Ignore content headers, let the webserver decide how to deal with the content. */
        if (trim($headerName) == 'Content-Encoding') continue;
        if (trim($headerName) == 'Content-Length') continue;
        if (trim($headerName) == 'Transfer-Encoding') continue;
        if (trim($headerName) == 'Location') continue;
        /* -- */
        /* Change cookie domain for the proxy */
        if (trim($headerName) == 'Set-Cookie')
        {
            $header = str_replace('domain='.$remoteDomain, 'domain='.$proxyDomain, $header);
        }
        /* -- */
        
    }
    header($header, FALSE);
}

echo $body;

if ($logHeaders)
{
    fclose($f);
}
curl_close($ch);

?>

EDIT:

当然,脚本必须位于(子)域的根目录中。 你应该有一个 .htaccess 来重写所有内容:

RewriteEngine On
RewriteRule .* index.php
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP,如何重定向/转发带标头和正文的 HTTP 请求? 的相关文章

  • 使用 file_get_content 发布数据

    我已经做了一些关于如何使用的研究file get content与帖子 我也读过this one https stackoverflow com questions 2445276 how to post data in php using
  • 为什么这评估为 true

    为什么这评估结果为真
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • if/else 简写来定义变量

    我很难理解 if else 的 php 简写是如何描述的here https stackoverflow com questions 20233207 php if shorthand and echo in one line possib
  • 使用 ImageMagick (PHP) 将 2 个图像并排合并为 1 个图像

    我认为这是一件容易的事 我有 2 张图片 JPG 我希望它们合并成一张图片 其中 2 张图片并排 所以我有图片 A 和图片 B 我想要图片 AB 并排 两个图像具有相同的宽度和高度 在本例中 宽度 200px 高度 300px 但是第二个图
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • Readfile 从大文件中读取 0 字节?

    我正在尝试通过以下方式发送一个大文件readfile 但是 没有任何内容发送到浏览器 并且readfile 回报0 not false 我尝试发送的文件大小为 4GiB 并且可由 PHP 读取 我正在设置set time limit 0 以
  • Smarty 如果 URL 包含

    使用 Smarty 标签我想确定 URL 是否包含单词 例如 if smarty get page contains product php 我知道 contains 不存在 但是我怎样才能轻松地编写类似的东西来实现上述代码呢 所有 PHP
  • 如何让Apache服务index.php而不是index.html?

    如果我将以下行放入index html文件 使 Apache 包含index php file 参观index html页面向我显示了这个 这是为什么 为什么它实际上不包含 PHP 文件 正如其他人指出的那样 您很可能没有 html设置为处
  • php中的条件格式化html表与时间戳比较

    echo table style width 100 tr echo td Order td echo td Destination td echo td Location td echo td Status td echo td Time
  • 从类似 cronjob 的语法创建“下次运行时间”日期

    在我正在创建的应用程序中 用户可以安排重复任务 生成间隔模式的简单值是 Minute 0 59 90 each minute Hour 0 23 90 each hour Day of month 1 31 90 each day of m
  • 获取字符串中的最后一个整数

    我需要隔离包含多个整数的字符串中最新出现的整数 我怎样才能得到23代替1 for lastnum1 text 1 out of 23 lastnum1 this gt getEval eregi replace out of text 你可
  • 如何在多次尝试后延迟登录尝试 (PHP)

    我正在开发一个用 PHP 构建的相当大的网站 该网站可能会有很多用户 我正在寻找一种方法来保护登录屏幕免受自动尝试的影响 我已经在注册表中添加了验证码检查 但还想进一步强化网站 据我所知 StackOverflow 上也有类似的问题 而且我
  • 在 WooCommerce 中添加到购物车之前清空购物车

    我正在使用 WP 作业管理器和 Woo Subscriptions Now 最初 我选择了一个套餐 Woo Subscription 然后我添加了所有细节 但没有提交 回到网站 所以要再次购买 我需要选择一个套餐 于是我选择了套餐并填写了详
  • 如何将 Smarty 3 包含到 Laravel 4 中?

    我是 Laravel 的新手 所以仍在习惯这些概念 但是我有大约 10 年的使用 Smarty 的经验 所以我希望利用这一点 除了事实上 Blade 似乎缺乏太多我发现有用且在 Smarty 中开箱即用的功能 但无论如何除了这个问题的要点之
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • 如何从 Laravel 执行存储过程

    我需要在表单提交数据后执行存储过程 我让存储过程按照我想要的方式工作 并且我的表单正常工作 我只是不知道从 laravel 5 执行 sp 的语句 它应该是这样的 执行 my stored procedure 但我似乎在网上找不到类似的东西
  • 反向引用在 PHP 中不起作用

    最近我一直在研究 更多的是在实践中说实话 正则表达式 我注意到他的力量 我提出的这个要求 link https stackoverflow com questions 30380397 take the text up to a speci
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for
  • 如果产品重量超过1000克,如何以公斤为单位显示

    在 Storefront 主题中 我使用下面的代码将格式化重量从 1000g 更改为 1kg add action woocommerce after shop loop item title show weight 10 function

随机推荐

  • Flutter 字符串插值中的不间断空格

    我有时需要在 Flutter Text 小部件中使用不间断的空格 例如 显示更多 链接或带有 50 km h 等单位的数字 下面的代码工作正常 但看起来过于复杂 const int nbsp 0x00A0 from https pub de
  • V-data-table 通过 v-slot:body 控制扩展项

    vuetify 2 0 v data tables 的文档没有指定如何通过 v slot body 控制扩展项 我有一个需要用主体 V 型槽指定的表格 并且想要使用扩展功能 预期的行为是单击表中一列中的按钮 该行将在下面展开 我使用 v s
  • Android 导入 Facebook SDK

    我已经尝试在我的应用程序中添加 Facebook 登录 共享选项近 3 4 天 但我完全无法做到这一点 我在每一步中不断遇到错误 我一直在关注很多教程 这是其中之一 https developers facebook com quickst
  • UIButton 可以同时带有图像和文本吗?

    我有一个宽度为 200 高度为 270 的按钮 我想在同一个按钮上显示文本和图像 不作为该文本的背景图像 相反 我想在同一个按钮上显示高度为 120 的文本和高度为 150 的图像 怎么做 您可以使用此代码 它将满足您的目的 h file
  • 在 scikit-learn 中使用交叉验证时绘制精确率-召回率曲线

    我正在使用交叉验证来评估分类器的性能scikit learn我想绘制精确率 召回率曲线 我发现一个例子 http scikit learn org stable auto examples plot precision recall htm
  • 在 python 中更新 tkinter 标签

    我正在努力通过将服务器的根实例传递到 Tkinter 窗口来为 python 服务器提供带有 tkinter 的 GUI 问题在于如何使标签中的信息保持最新 例如 服务器有一个用户列表 其中包含登录的用户 对于初始列表来说 这样做很简单 s
  • excel vba-提取2个字符之间的文本

    如果我有这个专栏 ColA NUMBER 8 3 NUMBER 20 我需要一个可以运行的 VBA 函数 请注意 这些开始和结束字符串只会在单元格中出现一次 extract val 单元格 start str end str IE extr
  • 将参数从 Jenkinsfile 传递到共享库

    我有几个组件 带有自己的 Bitbucket 存储库的代码项目 每个组件都有一个 Jenkinsfile 如下所示 properties parameters string defaultValue description List of
  • Azure AD B2C - 从所有会话中注销用户

    我有 3 个网站使用一个 B2C 租户 我被要求进行设置 以便当用户退出一个网站时 退出所有网站 如果他们的帐户被删除 情况也是如此 我认为我必须在每个请求上引入对 Azure 的调用 以确定用户是否仍然登录 但据我所知 没有一个 Grap
  • 如何禁用 HTML 标签?

    如果已经设置了标签 我想禁用它 例如 使用禁用菜单disabled true 或者其他的东西 我可以使用 PHP 完全删除标签 但我已经设计了它的样式 只想禁用它 是否可以 不 据我所知 没有任何仅 CSS 的方法可以按照您描述的方式禁用链
  • Python 字符串格式化:“%”比“format”函数更有效吗?

    我想比较不同的变量以在 Python 中构建字符串 using 连接 称为 加 using using join list using format功能 using 0
  • WPF:TreeViewItem 绑定到 ICommand

    我正忙于在 WPF 中创建我的第一个 MVVM 应用程序 基本上我遇到的问题是我有一个 TreeView System Windows Controls TreeView 我已将其放置在 WPF 窗口上 我决定将绑定到 CommandVie
  • 更改表类似

    是否可以在 ALTER TABLE 上使用类似于 MySQL 中的 CREATE TABLE 的 LIKE 语句 例如 创建表 db tbl1 像 db tbl2 这会克隆数据库表的结构 我想更改具有相同列的现有表 但要选择另一个表的主键
  • 如何设置字符串的颜色[重复]

    这个问题在这里已经有答案了 有谁知道我将如何设置将使用打印的字符串的颜色System out 这是我目前拥有的代码 System out println TEXT THAT NEEDS TO BE A DIFFERENT COLOR 安慰
  • 将 pandas 数据框中的多列拆分为行

    我有一个 pandas 数据框 如下所示 ticker account value date aa assets 100 200 20121231 20131231 bb liabilities 50 150 20141231 201312
  • 正则表达式的局限性? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Typescript 创建模块

    我想为我们的库创建模块 所以每次我们调用时 我们都可以使用import Api Map from ourlibrary 目前我正在使用以下 import Api from Library Api import MapPage from ma
  • 非常非常大的实体组的交易

    我正在尝试设计一个可以容纳大量数据的数据模型 有大量数据经验的人对此有什么反馈吗 即 example only not meant to compile public class TransactionAccount private lon
  • 如何对每小时时间序列重新采样以在特定时间开始并在 24 小时后结束

    我想从一天中的特定时间开始 在我的情况下 将从 2020 年 2 月 1 日 06 UTC 开始 对我的数据框进行重新采样 包括每小时降水量值 频率为 24 小时 2020 02 01 每小时数据帧图像 I tried df df resa
  • PHP,如何重定向/转发带标头和正文的 HTTP 请求?

    我有一个 PHP 页面 main php 位于服务器 1 上 我在服务器 2 上有一个 PHP 页面 main php 同一页面 不同的代码 main php 是一个 Web 服务 我想转发对服务器 1 服务器 2 发出的完整 HTTP 请