在双nginx反向代理中正确处理request_uri?

duk*_*ing 10 php joomla reverse-proxy nginx docker

所以,基本上我在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;
  }
}
Run Code Online (Sandbox Code Playgroud)

这按预期工作...转到http://:8081正确加载所有内容.

现在,8081只是暂时暴露在nginx容器中,我本来想要做的是设置一个反向代理,这样http:/// joomla将成为最终的端点.

为此,我正在努力处理以下conf文件:

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;
  }

}
Run Code Online (Sandbox Code Playgroud)

会发生什么是HTML正确提供,但没有资产.这是因为Joomla中的URL是由JURI类生成的,它似乎依赖于$ request_uri,当它看起来到达Joomla时已经丢失了.

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

因此,对文件,脚本或css的每个链接或引用都会呈现如下:

HTTP://本地主机/登录

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

代替:

HTTP://本地主机/的Joomla /登录

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

但是,当我访问第二组URL时,我可以毫无问题地访问链接/资产...但当然,再次没有正确呈现图像,模板,js或链接.

我不想触摸joomla.conf,除非出现问题,对于site.conf我只想翻译URI段以将请求映射到其他应用程序,例如:

/joomla -> localhost:8081
/phpbb -> localhost:8082
/someapp -> localhost:8083
Run Code Online (Sandbox Code Playgroud)

cns*_*nst 5

最干净的解决方案是修改上游,为所有资源提供唯一的路径.

从上游删除部分URL(使用唯一前缀)通常比将非额外部分添加到非唯一部分更容易.这是因为您始终可以捕获较长的URL并确切地知道它所引用的内容,随后将301或302重定向返回到更短更简洁的版本.

另一方面,面对一个简短的请求URL,比如/,很难确定它可能引用哪个应用程序(除非您同时查看$http_referer变量,然后根据URL请求的位置有条件地发出重定向来自),或者,除非实现某种形式的面条规则来检测其单独的URL指的是应用程序(如果你走这条路线,map指令可以派上用场).

此外,考虑到安全性,当涉及到cookie时,在单个域上运行多个独立应用程序并不是最佳做法 - 在一个应用程序中进行折衷很容易导致所有其他应用程序中的安全性违规.


Rob*_*ert 4

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

\n
public $live_site = \'/joomla/\';\n
Run Code Online (Sandbox Code Playgroud)\n

在 Github 中制作了一个完整的示例,该示例在编辑该文件后运行良好,并且它使用您的配置。

\n
\n

在此输入图像描述

\n
\n

\xc2\xa0 变为:

\n
\n

在此输入图像描述

\n