混合 SSL 内容防止 Joomla Installation/Operation 与 Nginx
Mixed SSL Content Preventing Joomla Installation/Operation with Nginx
我一定是遗漏了一些明显的东西,但由于混合内容,我无法在已经安装了 SSL 的站点上安装 Joomla 3.6.5。
我在浏览器控制台中得到以下信息:
Mixed Content: The page at 'https://example.com/joomla/installation/index.php' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://example.com/joomla/installation/index.php'. This request has been blocked; the content must be served over HTTPS.
XMLHttpRequest cannot load http://example.com/joomla/installation/index.php. Failed to start loading.
Web 搜索 "Joomla Installation on SSL" 和类似的所有生成的页面假设搜索如何引入 SSL AFTER
安装。
感谢关于如何避免为了安装 Joomla 而必须关闭 SSL 的想法。
编辑
事实证明,这是一个与使用 Nginx 等反向代理的 SSL 终止相关的问题,并且考虑到 Joomla v3.6 的运行方式,这不会影响 Apache。
Joomla v3.7: 安装与操作
首先,截至 2016 年 12 月 30 日,来自 GitHub 的 Joomla v3.7.x beta 测试似乎表明这不是该版本的问题。该版本无需进一步干预即可安装和运行。
这是用 proxy_set_header X-Forwarded-Proto $scheme;
测试的,下面讨论,已经到位但不需要设置 live_site
configuration.php.
中的变量
Joomla v3.6:安装
如果您尝试在已经使用 SSL 和严格的传输策略等保护的站点上安装,安装将因混合内容而失败。当您在填写安装步骤 1 / 3 的项目后按 "Next" 时会触发此故障。
请注意,这是一个静默失败,您会发现按下"Next"按钮后没有任何反应。知道出现错误的唯一方法是检查您的 js 控制台。
要解决这个问题,您将不得不进行一些黑客攻击:
/Installation/template/js/installation.js
中的第 357 行附近,
将 baseUrl = _base;
更改为 baseUrl =
_base.replace("http://","https://");
- 保存然后开始安装。
如果您在执行此操作之前已经加载了安装页面,请记住清除浏览器缓存。
安装文件夹在安装后被删除,所以这个一次性破解是微不足道的。
Joomla v3.6: 操作
关键是要记住 不要 在 configuration.php 或 Joomla 管理中的全局配置中设置 force_ssl 参数。默认值“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 的位置块,
- 设置
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。如果 mod_rpaf 和 mod_setenvif 在 Apache 中都不可用:
- 在 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 指令得到解决,升级不应导致任何问题
References/Sources
我在 "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" 设置未按预期工作。
我一定是遗漏了一些明显的东西,但由于混合内容,我无法在已经安装了 SSL 的站点上安装 Joomla 3.6.5。
我在浏览器控制台中得到以下信息:
Mixed Content: The page at 'https://example.com/joomla/installation/index.php' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://example.com/joomla/installation/index.php'. This request has been blocked; the content must be served over HTTPS.
XMLHttpRequest cannot load http://example.com/joomla/installation/index.php. Failed to start loading.
Web 搜索 "Joomla Installation on SSL" 和类似的所有生成的页面假设搜索如何引入 SSL AFTER
安装。
感谢关于如何避免为了安装 Joomla 而必须关闭 SSL 的想法。
编辑
事实证明,这是一个与使用 Nginx 等反向代理的 SSL 终止相关的问题,并且考虑到 Joomla v3.6 的运行方式,这不会影响 Apache。
Joomla v3.7: 安装与操作
首先,截至 2016 年 12 月 30 日,来自 GitHub 的 Joomla v3.7.x beta 测试似乎表明这不是该版本的问题。该版本无需进一步干预即可安装和运行。
这是用 proxy_set_header X-Forwarded-Proto $scheme;
测试的,下面讨论,已经到位但不需要设置 live_site
configuration.php.
Joomla v3.6:安装
如果您尝试在已经使用 SSL 和严格的传输策略等保护的站点上安装,安装将因混合内容而失败。当您在填写安装步骤 1 / 3 的项目后按 "Next" 时会触发此故障。
请注意,这是一个静默失败,您会发现按下"Next"按钮后没有任何反应。知道出现错误的唯一方法是检查您的 js 控制台。
要解决这个问题,您将不得不进行一些黑客攻击:
/Installation/template/js/installation.js
中的第 357 行附近, 将baseUrl = _base;
更改为baseUrl = _base.replace("http://","https://");
- 保存然后开始安装。
如果您在执行此操作之前已经加载了安装页面,请记住清除浏览器缓存。
安装文件夹在安装后被删除,所以这个一次性破解是微不足道的。
Joomla v3.6: 操作
关键是要记住 不要 在 configuration.php 或 Joomla 管理中的全局配置中设置 force_ssl 参数。默认值“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 的位置块,
- 设置
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。如果 mod_rpaf 和 mod_setenvif 在 Apache 中都不可用:
- 在 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());
- 在configuration.php中,设置
在Nginx中处理php的location块中,设置
proxy_set_header X-Forwarded-Proto $scheme;
这涉及到编辑核心 Joomla 文件,但由于下一个预期更新是 v3.7,此问题似乎已通过 Nginx proxy_set_header 指令得到解决,升级不应导致任何问题
References/Sources
我在 "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" 设置未按预期工作。