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】:完全删除<base>
标签应该可以解决您的问题。您可以在模板的 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的主要内容,如果未能解决你的问题,请参考以下文章