微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正确处理double nginx反向代理中的request_uri?

所以,基本上我在一个Docker PHP7-fpm容器中运行Joomla,然后我有一个Nginx容器,其中的joomla.conf文件定义如下:

#https://docs.joomla.org/Nginx server { listen 8081; error_log /var/log/Nginx/error.log; access_log /var/log/Nginx/access.log; server_name PHP-docker.local; root /usr/src/joomla; index index.PHP index.html index.htm default.html default.htm; location / { try_files $uri $uri/ /index.PHP?$args; } # deny running scripts inside writable directories location ~* /(images|cache|media|logs|tmp)/.*.(PHP|pl|py|jsp|asp|sh|cgi)$ { return 403; error_page 403 /403_error.html; } location ~ .PHP$ { fastcgi_pass joomla:9000; fastcgi_index index.PHP; fastcgi_split_path_info ^(.+.PHP)(/.+)$; include fastcgi_params; #include /etc/Nginx/fastcgi.conf; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }

而这个按预期工作…去http://:8081正确加载一切。

现在,8081只是临时暴露在Nginx容器中,我基本上想要做的是设置一个反向代理,使得http:/// joomla将成为最终的终结点。

为此,我正在努力与下面的conf文件

jupyterhub Nginx反向代理

反向代理Elasticsearch传输端口

一个最有效率:通过Nginx直接提供静态文件,还是通过Nginx反向代理来提供节点?

不能用Nginx(反向代理+ SSL协商)和Tomcat上传文件

Apache代理导致ERR_CONTENT_DECODING_Failed错误

server{ listen 80; server_name _; location /joomla/ { proxy_pass http://localhost:8081/; proxy_set_header Referer $http_referer; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; } }

会发生什么是HTML正确服务,但是,没有任何资产。 这是因为Joomla中的URL是由JURI类生成的,这个JURI类似乎依赖于$ request_uri,而这个请求在到达Joomla时已经丢失了。

https://github.com/joomla/joomla-cms/blob/6ab2a6e9010e7e04c260b9eba17dc76e866dd3e6/libraries/joomla/uri/uri.PHP#L87

因此,每个链接或对文件,脚本或CSS的引用都是这样呈现的:

HTTP://本地主机/login

HTTP://localhost/images/headers/maple.jpg

代替:

HTTP://本地主机/的Joomla /login

HTTP://localhost/joomla/images/headers/maple.jpg

然而,当我访问第二组URL时,我可以访问链接/资产没有问题…但当然,再次,没有图像,模板,JS或链接被正确渲染。

除非出现错误,否则我宁愿不要触及joomla.conf,至于site.conf,我只想将URI段转换为映射到其他应用程序的请求,例如:

/joomla -> localhost:8081 /PHPbb -> localhost:8082 /someapp -> localhost:8083

如何在rails日志中logging像Nginx这样的代理服务器上的真实客户端ip

configurationNginx代理微caching服务器块中的特定位置

有没有让Node.js充当HTTP反向代理的解决scheme?

Nginx反向代理,只允许从主机名不连接ip

来自Nginx的反向代理将无法运行。 网站是正常的

最干净的解决方案将是修改您的上游,为所有资源提供独特的路径。

从上游(具有唯一的前缀)移除URL的部分通常比向非唯一的部分添加额外的部分要容易得多。 这是因为你总是可以捕获更长的URL,并确切地知道它指的是什么,随后返回一个301或302重定向一个更短,更简洁的版本。

另一方面,面对像/这样的简短请求URL,很难确定它可能引用哪个应用程序(除非您也查看$http_referer变量,然后有条件地发出基于哪里的重定向URL请求来自于),或者除非你实现某种意大利细面条规则来检测哪个URL引用哪个应用程序(如果你走这条路线, map指令可能派上用场)。

另外,考虑到安全性以及Cookie的使用情况,在单个域中运行多个独立应用程序并不是最佳实践 – 在一个应用程序中妥协可能会导致所有其他应用程序中的安全违规。

正如Rinos所说,你需要在configuration.PHP中配置$live_site var,如下所示:

public $live_site = '/joomla/';

我在Github做了一个完整的例子,在编辑这个文件效果很好,它使用你的配置。

变为:

你可以尝试使用sub_filter它是如何在这个答案中提到的。

所以在你的情况下你的Nginx配置应该看起来像这样:

server{ listen 80; server_name _; location /joomla/ { proxy_pass http://localhost:8081/; proxy_set_header Referer $http_referer; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; sub_filter "http://your_server/" "http://your_server/joomla/"; sub_filter_once off; } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐