Joomla BASE HREF使用HTTP而不是HTTPS

14

我想将我的网站从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)设置为“everything”,但是然后网站就会出现无限的303错误,重定向到自身。(事后想想:我很惊讶这里出现了303而不是301。如果有人能解释一下,我会很感激的)

Laoneo提出了一些解决方案,但并没有成功。为了完整起见,在此列出)

  1. $live_site配置为https URL。
  2. 尝试更改$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
4个回答

23

很抱歉,但我认为当前的答案并不正确。这个答案提倡了一种 hack 的方法去绕过问题。下次更新 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。


1
听起来不错。我已经没有Joomla了,无法轻松测试这个功能。如果有机会,我会做相应标注的。在那之前,我会在我的回答中添加一条注释。很高兴有比我的hack更好的解决方案。 - Angelo Fuchs
我刚遇到了同样的问题,htaccess修复方法对我有效。 - Robert Went
这是正确的解决方案,而不是取巧。如果您想让您的网站默认为HTTPS,请将配置$live_site变量更改为https://{您的主机名},尽管初始浏览器href将显示为http,但首页上的所有链接都将正确包含https://。此外,Googlebot现在会测试https版本,因此您的索引链接随着时间的推移将更改为https://。 - garth
2
关于“为什么HTTPS服务器环境没有正确初始化?”有时加密是由某些网络基础设施在Web服务器之上处理的,这些Web服务器从未看到任何加密内容,对它们来说一切都是“明文HTTP”。这就是为什么有时候服务器环境似乎不正确:实际上它是正确的,只是HTTPS在其他地方被处理了。 - Med

7

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


2
谢谢,我刚刚尝试了这个(包括 $force_ssl 和不包括 $force_ssl),但是没有改变任何东西。 - Angelo Fuchs
我曾经使用过这个ssl重定向插件http://extensions.joomla.org/extensions/site-management/url-redirection/11326。你有检查过Apache访问/错误日志吗?是否有关于重定向的任何提示?您在Joomla配置中有哪些SEF设置?是否安装了任何SEF扩展? - Laoneo
我不知道'SEF'是什么意思。我将内容的元素编辑成了问题。 - Angelo Fuchs
在Joomla配置中,您可以定义您的SEF(搜索引擎友好的URL)设置。有一个选项可以使用mod rewrite技术。这就是我所说的。 - Laoneo
我使用SEF和重写技术。我尝试更改它,但没有帮助。 - Angelo Fuchs
似乎与SEF有关,看看我提供的解决方法作为答案。 - Angelo Fuchs

5

注意:这是一个hack。请先测试Daniel Dimitrov的答案。如果有效,请在此处留下评论。

我找到了一种解决方法。

在文件includes/application.php中,我更改了以下代码块:

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

to:

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

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

注意:在这个更改之后,管理员部分被破坏了,直到我在configuration.php中禁用了force_ssl。我通过我的Apache配置强制使用SSL,所以这对我不是问题。


0

完全删除<base>标签应该可以解决您的问题。您可以在模板的index.php文件中这样做:

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

由于这不是核心的黑客攻击,因此它将是升级稳定的。但是,如果您使用主题商店中的模板,并选择在未来升级模板,则可能需要重新添加代码。


参考资料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接