【问题标题】:ProxyPass & ProxyPassReverse - Get original URL from browser address barProxyPass 和 ProxyPassReverse - 从浏览器地址栏中获取原始 URL
【发布时间】:2016-07-25 09:26:07
【问题描述】:

我创建了两个网站(http://localhost/webonehttp://localhost/webtwo)。

Web 2 有这样的 URL:http://localhost/webtwo/webone(使用 ProxyPass 和 ProxyPassReverse)

如果我们转到上面的 URL,那会显示 web one 的内容。

现在如果有人访问网络,那么我想捕获用户访问 URL。(可能是 http://localhost/webonehttp://localhost/webtwo/webone)

我的问题是:

如果有人从http://localhost/webtwo/webone URL 访问网络二。然后,如果我执行以下代码,它将返回http://localhost/webone

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

但浏览器显示 URL 是 http://localhost/webtwo/webone。有人可以建议一种方法来捕获http://localhost/webtwo/webone URL。

【问题讨论】:

  • 你使用session来存储路径吗?
  • 试试$_SERVER[SCRIPT_NAME]
  • @JeffPuckettII 不工作
  • 您是否使用任何可能干扰REQUEST_URI 值的框架?你使用的是我假设的 Apache 网络服务器?
  • @chrki 我不使用任何框架,是的,我使用的是 Apache Web 服务器 (xampp)

标签: php apache


【解决方案1】:

您可以使用RequestHeader 指令将自定义请求标头添加到请求标头列表(紧跟在ProxyPass* 之后):

RequestHeader add X-REQUEST-URI "expr=%{HTTP_HOST}%{REQUEST_URI}"

这样您将拥有一个名为 HTTP_X_REQUEST_URI 的标头,它是请求的 URI 的持有者,可通过 $_SERVER['HTTP_X_REQUEST_URI'] 访问:

'HTTP_X_REQUEST_URI' => string 'localhost/webtwo/webone' (length=23)

还有一些由mod_proxy 设置的标题,您可能会觉得有用。来自apache.org

在反向代理模式下(使用ProxyPass 指令, 例如),mod_proxy_http 添加了几个请求标头,以便 将信息传递给源服务器。这些标题是:

X-Forwarded-For客户端的IP地址。

X-Forwarded-Host Host HTTP 请求头中客户端请求的原始主机。

X-Forwarded-Server 代理服务器的主机名。

【讨论】:

    【解决方案2】:

    当您使用代理时:

    使用$_SERVER['HTTP_X_FORWARDED_FOR'] 代替$_SERVER['REMOTE_ADDR']

    使用$_SERVER['HTTP_X_FORWARDED_HOST']$_SERVER['HTTP_X_FORWARDED_SERVER']
    代替 $_SERVER['SERVER_NAME']

    http://php.net/manual/de/reserved.variables.server.php

    【讨论】:

    • 为了防止伪造,请检查$_SERVER['REMOTE_ADDR'] 是您实际代理的IP。此外,如果原始请求已包含 X-headers,则它们将包含多个值。最后一个以逗号分隔的值应该是来自(受信任的)代理的值。 mod_proxy Reference
    【解决方案3】:

    ProxyPass 添加X-Forwarded-Host 标头,其中包含原始主机,并且可以在php 中以$_SERVER['HTTP_X_FORWARDED_HOST'] 访问。

    你的代码可以是这样的:

    $host = $_SERVER['HTTP_HOST'];
    if (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
        $host = $_SERVER['HTTP_X_FORWARDED_HOST'];
    }
    $actual_link = "http://" . $host . $_SERVER['REQUEST_URI'];
    

    【讨论】:

      猜你喜欢
      • 2018-06-21
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      相关资源
      最近更新 更多