V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xxxpara
V2EX  ›  PHP

PHP 是否能够实现将 http 请求转发到一个域名的指定 IP 下?

  •  
  •   xxxpara · 2017-07-10 16:16:06 +08:00 · 9122 次点击
    这是一个创建于 2693 天前的主题,其中的信息可能已经有所发展或是发生改变。

    php 是否能够实现将 http 请求转发到一个域名的指定 IP 下?比如 www.a.com 这个域名有多台服务器,IP 有 4 个,正常情况是随机的,如果我想在 PHP 层把访问的 IP 写死,有可能实现吗?

    我知道改 hosts 可以实现,现在是想尝试直接在代码层面实现,不知道有没有可能性

    40 条回复    2017-07-16 19:05:47 +08:00
    jhdxr
        1
    jhdxr  
       2017-07-10 16:24:47 +08:00
    为什么我觉得最近 PHP 话题下的帖子质量急剧下降,是有培训班老师把 V2EX 介绍出去了么。。。

    系统告诉我『请尽量让自己的回复能够对别人有帮助』,但这帖子我实在没读懂。什么叫把请求转发到一个指定的 IP 下?是用户访问 http://www.a.com ,然后请求到了你的机器上,你想把这个请求转发到别的固定的某一台处理 http://www.a.com 的机器上?还是转发到另外一个域名 http://www.b.com 的机器上?
    mscb
        2
    mscb  
       2017-07-10 16:26:10 +08:00 via Android
    可以是可以,但是如果能直接在 nginx 下配置一下,会不会更方便一点,省得开发?
    alex321
        3
    alex321  
       2017-07-10 16:30:44 +08:00
    都用了域名 IP 轮询了,何苦再回去呢;回退到低阶状态别轮询啊。
    xxxpara
        4
    xxxpara  
    OP
       2017-07-10 16:32:10 +08:00
    @mscb 可以指导一下具体方案?没怎么写过 PHP
    xxxpara
        5
    xxxpara  
    OP
       2017-07-10 16:34:17 +08:00
    @jhdxr 可能我表述不太清楚,我得意思是像修改电脑本地的 hosts 一样,通过 PHP 把域名的请求转发到 127.0.0.1 这个本地环境下,或者其他测试 IP
    xxxpara
        6
    xxxpara  
    OP
       2017-07-10 16:35:09 +08:00
    @alex321 是因为想能够实现访问指定的开发 /测试环境
    maojy1989
        7
    maojy1989  
       2017-07-10 16:37:25 +08:00
    在你跑 php 程序的机器上把 hosts 改了即可
    mscb
        8
    mscb  
       2017-07-10 16:38:10 +08:00 via Android
    @xxxpara 这个和 php 没什么关系,给你个关键词吧,我看不太懂你的具体需求。“ nginx 负载均衡" "nginx 配置文档“ 你去搜索一下看看,应该就懂了
    anyele
        9
    anyele  
       2017-07-10 16:40:59 +08:00
    培训班老师把 V2EX 介绍出去了。。。。。。
    xxxpara
        10
    xxxpara  
    OP
       2017-07-10 16:43:38 +08:00
    @mscb 这个 Nginx 配置我知道肯定是可行的,现在是想再不修改 Nginx 配置的前提下,用代码有可能做到吗
    xxxpara
        11
    xxxpara  
    OP
       2017-07-10 16:43:59 +08:00
    @maojy1989 现在是想再不修改 Nginx 配置的前提下,用代码有可能做到吗
    g8287694
        12
    g8287694  
       2017-07-10 16:44:50 +08:00
    @xxxpara 这么做意义何在?
    ysjdx
        13
    ysjdx  
       2017-07-10 16:47:49 +08:00
    curl 请求 ip header 里面加 Host:参数
    xxxpara
        14
    xxxpara  
    OP
       2017-07-10 16:48:21 +08:00
    @g8287694 客户想访问我们某个测试环境,我们不可能每个客户都去给他手动改配置
    所以在想能不能通过在请求中加一个参数让他们自己加上可以访问指定的环境
    vus520
        15
    vus520  
       2017-07-10 16:56:07 +08:00
    两个方法:
    1,直接用 curl,走代理模式,将 Host 请求直接指定到对应 IP
    ```
    curl baidu.com -x "127.0.0.1:80"
    ``
    2,PHP 的 CURL 库好像支持代理,可以直接用,如果不行,可以用 socket 打开对应 IP 的 80 端口,然后发送头信息"Host: baidu.com"


    下一题。
    mscb
        16
    mscb  
       2017-07-10 16:58:02 +08:00 via Android
    @xxxpara 在 php 程序开头,先判断一下当前服务器 ip,如果不是目标 ip,就用 socket 模拟 http 访问目标 ip 的服务器。
    不过这样做没啥意义啊?拖慢了访问速度。而且你同一个域名访问的内容不应该是一样的吗?
    rootx
        17
    rootx  
       2017-07-10 17:00:08 +08:00 via iPhone
    应该 nginx 层做的事情 不要在 PHP 层做 会影响性能的…当然如果不考虑性能就不谈了…
    xxxpara
        18
    xxxpara  
    OP
       2017-07-10 17:03:29 +08:00
    @mscb 这个不是部署到正式环境的,仅仅是提供给客户体验某个环境下的业务代码
    xxxpara
        19
    xxxpara  
    OP
       2017-07-10 17:03:39 +08:00
    @rootx 这个不是部署到正式环境的,仅仅是提供给客户体验某个环境下的业务代码
    GreatHumorist
        20
    GreatHumorist  
       2017-07-10 17:11:24 +08:00
    可以用 dns 解析进行负载均衡也可以用 nginx 进行负载均衡,用 php 本身的话效率不能保证,而且不科学。
    Famio
        21
    Famio  
       2017-07-10 17:12:19 +08:00
    这个问题就好像上午看到的 css 的问题一样,明明可以用 css 来完成布局,有些人非要用 js 来做。
    xxxpara
        22
    xxxpara  
    OP
       2017-07-10 17:15:50 +08:00
    @Famio 原因我上面已经解释了..这个不是部署到生产环境的,临时用来做业务体验,但是测试 ip 有好几个,域名只有一个
    UnknownR
        23
    UnknownR  
       2017-07-10 17:50:46 +08:00
    看下 nginx 的介绍文档,里面有你这种情况的处理配置
    或者你可以试一下设置 URL 头部, 域名改成 IP
    torbrowserbridge
        24
    torbrowserbridge  
       2017-07-10 17:58:42 +08:00
    13 楼正解
    Tairy
        25
    Tairy  
       2017-07-10 18:01:00 +08:00
    刚看 Laravel 的时候看到这种神操作,惊呆了。

    ![]( )
    eecjimmy
        26
    eecjimmy  
       2017-07-10 18:16:21 +08:00 via iPhone
    不如直接写个批处理自动更改和还原方便,本来就是少数临时体验用。
    gouchaoer
        27
    gouchaoer  
       2017-07-10 18:20:07 +08:00
    那你为什么不直接用 ip 访问?
    iyaozhen
        28
    iyaozhen  
       2017-07-10 18:23:39 +08:00 via Android
    @ysjdx 正解。

    这事和 php 没啥关系呀。要加强 http 协议的学习呀
    LoliconInside
        29
    LoliconInside  
       2017-07-10 18:26:29 +08:00   ❤️ 1
    curl -H 'Host:www.xxx.com' http://x.x.x.x
    下 一 题
    imcj
        30
    imcj  
       2017-07-10 18:32:57 +08:00 via iPhone
    用 ReactPHP,支持 epoll 模型可以做这事。

    统一回复楼上什么 php 不适合。php 就是一个语言,有各种可能,用 php 做转发,去实践一下,我觉得没错。

    如果人失去了好奇心,失去了改变现状。v2ex 的逼格不正是创意?创意包含打破。包含好奇。
    jasontse
        31
    jasontse  
       2017-07-10 18:51:24 +08:00 via iPad   ❤️ 1
    打好 HTTP 协议基础就知道该怎么做
    curl setopt url http://127.0.0.1
    curl setopt header host:www.a.com
    shyling
        32
    shyling  
       2017-07-10 19:49:39 +08:00   ❤️ 1
    fsockopen(指定 ip); fwrite('Host: 域名')
    fhefh
        33
    fhefh  
       2017-07-10 21:42:33 +08:00
    https://www.ngrok.cc/

    楼主看看这个 是不是你想要的东西
    msg7086
        34
    msg7086  
       2017-07-10 23:57:57 +08:00
    要连接目标服务器 DNS 解析中的某一个特定 IP,
    要么 hosts 写死 IP 地址,
    要么代码里写死 IP 地址。
    zhs227
        35
    zhs227  
       2017-07-11 06:31:05 +08:00
    假设你要访问的 IP 是 192.168.1.x, 然后平常是通过 www.example.com 来访问。采用 curl 自定义头部 Host,发送请求到 http://192.168.1.x/page, 带上 Host: www.example.com , 就可以了。如果是 nginx 负载均衡的,需要后端可以直接提供访问,把访问直接发送到后端,不要通过负载均衡转发。
    suconghou
        36
    suconghou  
       2017-07-11 13:40:34 +08:00   ❤️ 1
    我觉得不是 PHP 的帖子质量下降了,是 v2 用心帮助别人的心态少了,一上来就喷,题主已经知道其他方式,但是需要了解自己需要的那种方式, 很少人能正面回答,一直强调一些另类方法, 题主也不是没有思考的人,自己就会清楚那种最合适.
    顺便附上答案
    <script src="https://gist.github.com/suconghou/e0bb202cdb8344105a4287e8eca8d12e.js"></script>
    lzhr
        37
    lzhr  
       2017-07-11 15:03:19 +08:00
    @imcj V2EX 增强插件 可以 @ 所有人
    xxxpara
        38
    xxxpara  
    OP
       2017-07-11 16:57:16 +08:00
    @suconghou 谢谢!终于有个能理解我的,不过上网多了,心态也就平淡了
    mkeith
        39
    mkeith  
       2017-07-16 16:10:04 +08:00
    @suconghou 不知道这个 php 代码部署到哪儿呢,客户端吗?还不如改 host 啊
    suconghou
        40
    suconghou  
       2017-07-16 19:05:47 +08:00
    @mkeith 题主的要求就是不改 host 用代码实现; 具体情况具体分析.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2798 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:12 · PVG 21:12 · LAX 05:12 · JFK 08:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.