joomla BASE HREF 使用 HTTP 而不是 HTTPS

Posted

技术标签:

【中文标题】joomla BASE HREF 使用 HTTP 而不是 HTTPS【英文标题】:joomla BASE HREF uses HTTP instead of HTTPS 【发布时间】:2013-11-13 00:51:16 【问题描述】:

我想将我的网站从 http 更改为 https。总是。

所以我相应地配置了我的 apache。现在,当我输入网站的 URL (https://steamnet.de) 时,它会很好地加载索引网站,但没有任何引用的元素(CSS、图像等)

在我看来,这样做是因为base href 设置为http://steamnet.de/,而你没有在那里使用https。我已将我的 Firefox 配置为不应加载混合内容。

那么我怎样才能告诉 Joomla 将 base href 设置为 https://steamnet.de(或者以其他方式使网站完全 ssl?)

我尝试将 joomla 配置的全局 ssl 强制元素(德语中的“SSL erzwingen”,configuration.php 中的 $force_ssl)设置为“一切”,但随后站点因无限 303 错误重定向到自身而中断。 (事后想:我很惊讶在这里找到303 而不是301。如果有人能解释一下,我将不胜感激)

(Laoneo 提出了一些解决方案,但没有成功,为了完整起见,这里是列表)

    $live_site 配置为https url。 如果更改 $sef$sef_rewrite 有帮助,请调查。

apache 日志: access.log

91.42.221.000 - - [03/Nov/2013:12:41:25 +0100] "GET / HTTP/1.1" 303 4854 "-" "Mozilla/5.0 (Gecko) Firefox/64"
91.42.221.000 - - [03/Nov/2013:12:41:25 +0100] "GET / HTTP/1.1" 303 516 "-" "Mozilla/5.0 (Gecko) Firefox/64"
91.42.221.000 - - [03/Nov/2013:12:41:25 +0100] "GET / HTTP/1.1" 303 516 "-" "Mozilla/5.0 (Gecko) Firefox/64"

error.log 不包含任何访问权限,但reload 上的以下行

[Sun Nov 03 12:41:16 2013] [notice] Graceful restart requested, doing restart
[Sun Nov 03 12:41:16 2013] [error] (9)Bad file descriptor: apr_socket_accept: (client socket)
[Sun Nov 03 12:41:17 2013] [warn] RSA server certificate CommonName (CN) `Angelo Neuschitzer' does NOT match server name!?
[Sun Nov 03 12:41:17 2013] [notice] Apache/2.2.16 (Debian) PHP/5.3.3-7+squeeze17 with Suhosin-Patch proxy_html/3.0.1 mod_ssl/2.2.16 OpenSSL/0.9.8o configured -- resuming normal operations

【问题讨论】:

【参考方案1】:

很抱歉,但我认为当前的答案并不正确。这个答案促进了黑客攻击并解决了这个问题。下次更新 Joomla 时,您必须更新核心文件,因为它将被覆盖。

实际上,如果我们在 getInstance 中查看 JURI 的代码,我们可以看到:

// Determine if the request was over SSL (HTTPS).
if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off'))

        $https = 's://';

else

        $https = '://';

问题是为什么有 $_SERVER['HTTPS'] 显然没有初始化的服务器。虽然我不能告诉你为什么,但我发现在开始时将这行添加到 .htaccess 文件中:

<IfModule mod_env.c>
   SetEnv HTTPS on
</IfModule>

通过这样做 $_SERVER['HTTPS'] 似乎已初始化,Juri::current 将返回我们所期望的 - 一个以 https 开头的 url。

【讨论】:

听起来不错。我没有可以轻松测试它的 joomla 了。如果我曾经来过它,我会相应地标记它。在那之前,我会在我的答案中添加一个注释。我很高兴有比我的 hack 更好的解决方案。 我刚刚遇到了同样的问题,htaccess 修复对我有用。 这是正确的解决方案,而不是 hack。如果您希望您的网站默认为 https://,请将 config $live_site var 更改为 https://您的主机名,虽然初始浏览器 href 将显示为 http,但首页上的所有链接都将正确包含 https:// /。此外,Googlebot 现在会测试 https 版本,因此您的索引链接会随着时间的推移变为 https://。 关于“为什么 HTTPS 服务器环境未正确初始化?”,有时加密由网络服务器上方的某些网络基础设施负责,而这些网络服务器从未看到任何加密的内容,对他们来说一切都是“清除http”。这就是为什么有时,server env 似乎是错误的:实际上它是正确的,只是 https 被其他地方处理了。【参考方案2】:

检查您的 configuration.php 文件中的 *$live_site* 变量并将其更改为您的 https 地址。

【讨论】:

谢谢,我刚试过这个(有和没有$force_ssl),但没有任何改变。 我用过一次这个 ssl 重定向插件extensions.joomla.org/extensions/site-management/…。您是否检查了 apache 访问/错误日志?是否有任何关于重定向的提示。您的 Joomla 配置中有哪些 SEF 设置?是否安装了任何 SEF 扩展? 我不知道“SEF”是什么意思。我将内容的元素编辑到问题中。 在您的 Joomla 配置中,您可以定义您的 SEF(搜索引擎友好网址)设置。可以选择使用 mod 重写技术。这就是我所说的。 我使用 SEF 和重写技术。我尝试改变它,但它没有帮助。【参考方案3】:

注意:这是一个 hack。请先测试Daniel Dimitrovs answer。如果可行,请在此处给我留言。

我找到了解决办法。

在文件includes/application.php我更改了以下块

if($router->getMode() == JROUTER_MODE_SEF) 
   $document->setBase(JURI::current());

到:

if($router->getMode() == JROUTER_MODE_SEF) 
   $document->setBase(JURI::root());

我不知道为什么JURI::current() 返回一个http URL 而不是https,但更改后网站按预期工作。

小心:在更改之后,管理员部分被破坏,直到我在 configuration.php 中禁用 force_ssl。我通过我的 apache 配置强制执行 SSL,所以这对我来说不是问题。

【讨论】:

【参考方案4】:

完全删除&lt;base&gt; 标签应该可以解决您的问题。您可以在模板的 index.php 文件中执行此操作,如下所示:

$doc = JFactory::getDocument();
unset($doc->base);

由于这不是核心 hack,因此它是防升级的。但是,如果您使用主题商店的模板,并选择将来升级模板,则可能需要重新添加代码。


参考资料:

Protocol Relative URLs not working How to remove the "base href" tag Joomla 3

【讨论】:

以上是关于joomla BASE HREF 使用 HTTP 而不是 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

joomla mvc架构, 原理

登录en Joomla desde una script externo

joomla 插入百度地图

在外部PHP文件中加载Joomla 3.x框架和模块

joomla微信

尝试在localhost上编辑Joomla时出现HTTP错误