如何在代理后面找到应用程序的基本URL?

问题描述 投票:1回答:1

我们基于PHP的应用程序(定制的,没有框架)有时需要使用其基本完整URL(例如,将URL存储在发送给客户端的文件中)。例如,基于this question,我们的应用程序会对此进行猜测(这是基于__FILE__$SERVER中的各种变量(例如SCRIPT_NAMESERVER_NAME)进行比较)。

现在我们需要在我们的应用程序前面设置一个(nginx)反向代理。假设我们将https://example.com/some/dir/onproxy/映射到http://backend/another/dir/onbackend/

有没有一种方法可以从https://example.com/some/dir/onproxy/上的代码中猜测公共URL(backend

[AFAIU(根据我的阅读和实验),这是不可能的(HTTP_HOST可能为example.com,但我没有发现任何表示some/dir/onproxy的内容)),但可能我丢失了某些内容(某些变量或nginx配置选项) 。

任何想法?

如果不可能,唯一的解决方案是将https://example.com/some/dir/onproxy/存储在配置中,对吗?

编辑1

根据@Progman的建议,我在this question上尝试了解决方案。我已经尝试了接受的答案和第二高评价的答案,但是都返回了后端(http://backend/another/dir/onbackend/)上的URL(该URL的某些变化)。

编辑2

我忘记提及我想避免依赖代理中的URL重写。

php reverse-proxy nginx-reverse-proxy
1个回答
1
投票

由于Nginx在到达PHP后端之前更改了请求,所以解决方案是以某种方式将原始请求数据添加到代理请求中。

一个常用的约定是将原始数据添加为额外的HTTP标头。参见X_Forwarded_For作为示例。

要将原始请求路径添加为新的标头,请向Nginx添加proxy_set_header指令。

location /some/dir/onproxy/ {
    rewrite ^/some/dir/onproxy/(.*)$  /another/dir/onbackend/$1 break;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Request-URI $request; #** This adds the original path as a header **
    proxy_set_header Host $http_host; # **Optional, will retain the original host name**
    proxy_pass http://backend;
}

与您的配置类似的操作会将原始请求代理到后端的PHP Web服务器。它确实假定后端是HTTP服务器,而不是PHP-FPM。

在PHP中,获取单个HTTP标头值的最快方法是通过$_SERVER。原始请求路径将在$_SERVER['HTTP_X_REQUEST_URI']中。

这只是一个示例,您可能需要测试和调试应用程序以完善解决方案。 php_info();是对PHP环境有用的调试工具,但是对恶意参与者也很有用,因此请尽快从代码中删除代码或采取其他措施以确保它不会被暴露。

© www.soinside.com 2019 - 2024. All rights reserved.