php - 在双 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 文件:

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 提供了正确的服务,但是,没有任何 Assets 。这是因为 Joomla 中的 URL 是由 JURI 类生成的,该类似乎依赖于 $request_uri,当它似乎到达 Joomla 时,它已经丢失了。

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

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

http://localhost/login

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

代替:

http://localhost/joomla/login

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

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

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

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

最佳答案

最简洁的解决方案是修改上游,为所有资源提供唯一路径。

从上游删除部分 URL(具有唯一前缀)通常比向非唯一部分添加额外部分要容易得多。这是因为您始终可以捕获较长的 URL 并准确了解它所指的内容,然后将 301 或 302 重定向返回到更短、更简洁的版本。

另一方面,面对短请求 URL,例如 /,很难确定它可能引用哪个应用程序(除非您查看 $http_referer 变量,然后根据 URL 请求的来源有条件地发出重定向),或者除非您实现某种意大利面条规则来检测哪些单独的 URL 引用了哪些应用程序(如果您走这条路线,the map directive可能会派上用场)。

此外,考虑到安全方面,当涉及到 cookie 时,在单个域上运行多个独立应用程序并不是最佳实践——一个应用程序的妥协很容易导致所有其他应用程序的安全违规。

https://stackoverflow.com/questions/44837737/

相关文章:

macos - 在 docker 中运行 Webpack-dev-server 比在本地机器上运行要

docker - 如何使用 docker-compose yml 文件进行生产?

docker - Dockerfile 中的开发依赖项或用于生产和测试的单独 Dockerfile

python - 如何将包含所有依赖项的 python 包安装到 Docker 镜像中?

docker - 是否可以使用 Winscp 连接到正在运行的 docker 容器?

docker - 失败 : port is already allocated

docker - Jenkins 2.0 : Running SBT in a docker con

java - 如何在Docker中初始化数据库后启动flyway

docker - 对 docker 的 -i "Keep STDIN open even if no

networking - 如何将 Docker 网络暴露给主机?