【问题标题】:Mixed SSL Content Preventing Joomla Installation/Operation with Nginx使用 Nginx 防止 Joomla 安装/操作的混合 SSL 内容
【发布时间】:2016-12-21 17:54:13
【问题描述】:

我肯定遗漏了一些明显的东西,但由于内容混合,我无法在已经使用 SSL 的网站上安装 Joomla 3.6.5。

我在浏览器控制台中得到以下信息:

混合内容:“https://example.com/joomla/installation/index.php”处的页面通过 HTTPS 加载,但请求了不安全的 XMLHttpRequest 端点“http://example.com/joomla/installation/index.php”。此请求已被阻止;内容必须通过 HTTPS 提供。

XMLHttpRequest 无法加载 http://example.com/joomla/installation/index.php。开始加载失败。

网络搜索“Joomla Installation on SSL”和类似的搜索都会生成假设搜索如何引入 SSL AFTER 安装的页面。

了解如何避免为了安装 Joomla 而关闭 SSL。

编辑

原来这是一个与使用反向代理(如 Nginx)的 SSL 终止相关的问题,并且考虑到 Joomla v3.6 的编写方式,这不会影响 Apache。

【问题讨论】:

    标签: ssl nginx joomla reverse-proxy mixed-content


    【解决方案1】:

    Joomla v3.7:安装和操作

    首先,截至 2016 年 12 月 30 日,来自 GitHub 的 Joomla v3.7.x beta 测试似乎表明这不是该版本的问题。该版本无需进一步干预即可安装和运行。

    这已使用 proxy_set_header X-Forwarded-Proto $scheme; 进行了测试,如下所述,已经到位,但无需在 configuration.php 中设置 live_site 变量。


    Joomla v3.6:安装

    如果您尝试在已使用 SSL 和严格的传输策略等保护的站点上进行安装,则由于内容混合,安装将失败。安装步骤 1 of 3 的项目填写完毕后按“下一步”会触发此故障。

    请注意,这是一个静默失败,您会发现按下“下一步”按钮后没有任何响应。知道有错误的唯一方法是检查你的 js 控制台。

    要解决这个问题,您必须进行一些黑客攻击:

    • /Installation/template/js/installation.js的357号线附近, 将 baseUrl = _base; 更改为 baseUrl = _base.replace("http://","https://");
    • 保存然后开始安装。

    如果您在执行此操作之前已经加载了安装页面,请记住清除浏览器缓存。

    安装后安装文件夹会被删除,所以这个一次性破解很简单。


    Joomla v3.6:操作

    关键是要记住不要在 configuration.php 中设置 force_ssl 参数或在 Joomla Admin 中设置 Global Configuration。默认值 '0' 并不意味着使用 NONSSL 作为措辞可能建议,而是维护用于当前请求的协议。请参阅/libraries/joomla/application/route.php 中的注释。

    A) 如果使用 Nginx 和 FastCGI,如 PHP-FPM:

    • 在 Joomla 中,将 configuration.php 中的 live_site 变量设置为 https://example.com/path/to/joomla
    • 在 Nginx 中,在 location 块中设置fastcgi_param HTTPS "on"; 递php

    B) 如果使用 Nginx 并将 PHP 代理到 Apache:

    (按照最理想到最不理想的方法)

    1。如果在 Apache 中启用了mod_rpaf

    • 在 Joomla 的 configuration.php 中,将 live_site 变量设置为 https://example.com/path/to/joomla
    • 在Nginx中处理php的location块中,

      • 设置proxy_set_header X-Forwarded-Proto $scheme;
      • 设置proxy_set_header X-Forwarded-Port $server_port;
      • 设置proxy_set_header X-Forwarded-HTTPS "on";

      请注意,mod_rpaf 有两个版本。带有“0.6”版本标签的较旧的原始版本最有可能在网络搜索后找到。

      虽然它非常适合从反向代理转发真实 IP,但它不做这里需要的其他事情。较新的,独立开发的,转发 Real IP、Real Port 和 Real Protocol。

      不幸的是,如果使用包管理器安装,您几乎肯定会得到旧版本。所以从 GitHub 下载并手动安装

    2。如果在 Apache 中启用了mod_setenvif

    • 在 Joomla 的 configuration.php 中,将 live_site 变量设置为 https://example.com/path/to/joomla
    • 在Nginx中处理php的location块中,设置proxy_set_header X-Forwarded-Proto $scheme;
    • 在 Apache 中,设置 SetEnvIfNoCase X-Forwarded-Proto https HTTPS=on 在相关的 htaccess 或 conf 文件中

    3。如果 Apache 中既没有 mod_rpaf 也没有 mod_setenvif:

    • 在 Joomla 中
      • 在 configuration.php 中,将 live_site 变量设置为 https://example.com/path/to/joomla
      • 73号线附近 /libraries/joomla/document/renderer/html/head.php,将 $base = $document->getBase(); 更改为 $base = str_replace("http://", "https://", $document->getBase());
    • 在Nginx中处理php的location块中,设置proxy_set_header X-Forwarded-Proto $scheme;

      这涉及编辑核心 Joomla 文件,但由于下一个预期更新是 v3.7,在该版本中,该问题似乎已通过 Nginx proxy_set_header 指令解决,因此升级不应导致任何问题


    参考/来源

    1. https://joomla.stackexchange.com/questions/1021/reverse-ssl-proxy-support
    2. https://forum.joomla.org/viewtopic.php?t=845318#p3313092
    3. https://www.hiawatha-webserver.org/forum/topic/1906

    【讨论】:

      【解决方案2】:

      我在“libraries/joomla/uri/uri.php”的第 65 行附近找到了这段代码:

      // Determine if the request was over SSL (HTTPS).
      if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off'))
      {
          $https = 's://';
      }
      else
      {
          $https = '://';
      }
      

      看起来应用程序正在检测它的 SSL 连接,显然,当服务器位于处理 SSL 连接的代理后面时,它会失败。为了进行测试,我将 else 更改为 's://' 并恢复了所有其他(以前的)hack。 “混合内容”问题得到解决。 但是,一个扩展程序(OS Membership Pro)现在出现了一个奇怪的问题。

      Joomla 核心开发人员应该对此进行研究,提供覆盖以强制 SSL。 configuration.php 中的“force_ssl”设置未按预期工作。

      【讨论】:

      • 太棒了!如果在 Nginx 中使用 fastCGI,那么不要修改/libraries/joomla/document/renderer/html/head.php,只需设置fastcgi_param HTTPS 'on'。这将避免编辑任何核心文件。但是,如果将 PHP 代理到另一个网络服务器,则需要该 hack,因为没有 proxy_param 指令。在任何一种情况下都需要更改 configuration.php 中的 live_site,但这不是 hack。
      • 嗨,Dayo - 好点。我检查了 fastcgi_param HTTPS 并提供了回复。
      • 我刚刚测试了即将发布的 v3.7 并注意到问题似乎已经解决。因此,启用反向代理中的 SSL 终止,并将所有请求发送到 SSL,v3.7 开箱即用,无需任何干预。用于安装和操作。是否打开“force_ssl”也无关紧要(但在这种情况下应保留为“0”)。换句话说,v3.7 按预期工作。
      猜你喜欢
      • 2015-10-07
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      相关资源
      最近更新 更多