我们基于PHP的应用程序(定制的,无框架的)有时需要使用其基本完整URL(例如,将URL存储在发送给客户端的文件中)。例如,基于这个问题,我们的应用程序对此进行了猜测(这是基于like和中的__FILE__
各种变量的比较)。$SERVER
SCRIPT_NAME
SERVER_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所建议的那样,我尝试了有关此问题的解决方案。我已经尝试了接受的答案和投票率第二高的答案,但是都返回了后端(http://backend/another/dir/onbackend/
)的URL(该URL的某些变化)。
编辑2
我忘了提及我要避免依赖代理中的URL重写。
由于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环境有用的调试工具,但是对恶意参与者也很有用,因此请尽快从代码中删除代码或采取其他措施以确保它不会被暴露。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句