2016-07-25 136 views
2

我创建了两个网站(http://localhost/webone,http://localhost/webtwo)。ProxyPass&ProxyPassReverse - 从浏览器地址栏获取原始网址

网的两个具有URL是这样的:http://localhost/webtwo/webone(使用的ProxyPass和ProxyPassReverse)

如果我们去上面的网址,该网页一个的是显示内容。 。

现在,如果有人访问网站之一,那么我要赶用户访问的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。

+0

你使用会话来存储路径? –

+0

尝试'$ _SERVER [SCRIPT_NAME]' –

+0

@JeffPuckettII不工作 – user3099298

回答

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设定时,你可能鱼翅d有用。从apache.org

当在反向代理模式(使用ProxyPass指令, 例如)作用,mod_proxy_http增加了几个请求头以 通信息到原始服务器。这些标头是:

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

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

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

0

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']; 
1

当你落后代理

使用$_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

+0

为了防止伪造,请检查$ _SERVER ['REMOTE_ADDR']'是您的实际代理服务器的IP。另外,如果原始请求已包含它们,则X-header将包含多个值。最后一个以逗号分隔的值应该是来自(可信)代理的值。 [mod_proxy参考](http://httpd.apache.org/docs/current/mod/mod_proxy.html#x-headers) – Kontrollfreak

相关问题