xxxpara
V2EX  ›  PHP

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

  •  
  •   xxxpara · Jul 10, 2017 · 10232 views
    This topic created in 3408 days ago, the information mentioned may be changed or developed.

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

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

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

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


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

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

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

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

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

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