HTTPS和HTTP ExpressionEngine网站URL标签

8
今天我发现,如果您访问使用{site_url}标记在文档头中的css链接路径的EE网站,并且输入https而不是http,该网站无法加载CSS文件。
我通过使用htaccess文件强制转换为http来解决了这个问题,但我想知道是否有EE内部的设置可以使两者都可行?
这只在Chrome和IE上发生,我猜这取决于您的浏览器安全设置。
6个回答

7

1
嘿,斯科特 - 我注意到你已经帮助回答了一些EE问题。如果你能在这里支持我们的EE Stack Exchange提案,那将是非常棒的:http://area51.stackexchange.com/proposals/46387/expressionengine?referrer=AwnV9oYF5EKlETXKp3ZQQw2(我们需要200分以上的人)。 - Adrian Macneil

6
很少有人知道可以使用协议相对URL来处理资源文件。
例如:
<link rel="stylesheet" href="//www.site.com/site.css">
<script type="text/javascript" src="//www.site.com/site.js"></script>

如果浏览器通过HTTPS查看SSL页面,则它将使用https协议请求该资源,否则将使用HTTP请求。这可以避免在IE中出现可怕的“This Page Contains Both Secure and Non-Secure Items”错误消息,使所有资产请求都保持在同一协议中。
更多信息请参见此处:(链接)
引用: “没有方案(http:或https :)的相对URL是有效的,根据RTF 3986:第4.2节。如果客户端无法理解它,则是客户端的问题,因为他们没有遵守RFC规定的URI语法。” “你的例子是正确的,应该可以工作。我自己在高流量站点上使用了那种相对URL方法,并且没有任何抱怨。此外,我们测试了Firefox,Safari,IE6,IE7和Opera中的网站。这些浏览器都理解该URL格式。”

这是一个好的、优雅的解决方案!但要注意:EE 显然不喜欢以这种方式设置 site_url,供参考。 - Scott Hepler
谢谢你的回复,我猜想如果你想在模板中使用全局变量,你只需要创建一个使用//www.site.com的变量,因为标准的{site_url}只会输出http。 - Gareth

5

当我加载CSS和JS时,我从不使用域名,而是设置为相对路径。例如:

<link rel="stylesheet" href="/layout/styles/layout.css" >

如果你尝试这个,会起作用吗?


Gareth 可能正在使用 {stylesheet=} 来获得其中的优势,如果是这样,他提到的行为将会出现。 - Scott Hepler
嗨,Sean,是的,那个方法很好用,我最终也是这样做的。上面Deviarte的答案看起来是一个有趣的解决方案? - Gareth

3
您可以在system/expressionengine/config/config.php文件中使用PHP设置{site_url}配置,包括协议的动态设置。例如:
// Detect protocol and server host
$protocol = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") ? "https://" : "http://";
$base_url = $protocol . $_SERVER['HTTP_HOST'];

// Set EE index page
$config['index_page'] = "";

// Set base and site URL
$config['base_url'] = $base_url . "/" . $config['index_page'];
$config['site_url'] = $config['base_url'];

你可以从config.php的基础上构建你的主题路径、各种图像路径、上传路径等等。但是,$config['site_url']会影响{path=""}{stylesheet}标签的输出。
更多想法,请参见NSM的Config Bootstrap文件或文章为多个服务器配置ExpressionEngine。有关您可以在config.php中设置的所有路径,请参见EE2 Config Overrides

1

我使用Nginx。

我不知道为什么,但是如果我使用绝对URL(完整路径)而不是相对URL(/以域名如CreateSean所说开头,//以协议如Deviarte所说开头),各种浏览器中的资源加载速度显着更快(或者是相对URL加载速度更慢吗?我不知道)。因此,它们的解决方案/做法(我过去一直在使用...现在仍然在使用)都不适用于我的环境。

相反,我在config.php中执行了以下操作:

$config['base_url'] = $_SERVER["scheme_url"];
$config['site_url'] = $_SERVER["scheme_url"];

请注意,如果PHP中不存在scheme_url,则可能需要提供它。如果像我一样使用php-fpm,请在nginx站点配置中根据需要添加/设置此项。
    fastcgi_param scheme_url "$scheme://$host/";

编辑:

在查看bootstrap/configs时,有些人使用在配置变量前添加协议的方法(例如上面未解释的Bacn的评论)。在Nginx中,默认情况下没有HTTPS服务器变量,在您的虚拟主机配置中为php添加ssl,如下所示:

    fastcgi_param   HTTPS   on; 

1

大家好,

这里是我使用Apache和Config.php文件来重写URL的方法,以避免浏览器触发“非SSL内容警告”。我仍然在我的模板中使用{path}和{stylesheet}变量,因为它们太好用了 :)

在Apache的htaccess文件中:

# Set an Apache 'site_url' variable to http when accessed via http:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ - [E=site_url:http://mysite.com]


# Set Apache 'site_url' variable to https when accessed via https
RewriteCond %{SERVER_PORT} 443
RewriteRule ^(.*)$ - [E=site_url:https://mysite.com]

然后在system/expressionengine/config.php文件中

将以下两行代码添加到您的代码中(确保您没有在配置文件中的其他地方设置这些变量)

$config['base_url'] = $_SERVER["site_url"];
$config['site_url'] = $_SERVER["site_url"];

据我理解,site_url变量是EE用于{stylesheets}和{paths}的变量。

俗话说的“最后一件事”:

如果您仍然收到非SSL警告,请查看源代码并在源代码中搜索“http://”。这些是罪魁祸首。它们是硬编码链接,没有使用base_url/site_url变量设置。

您需要在文章/模板/变量/片段中找到这些http调用,并将这些调用替换为简单的//。
因此,一个调用变成

http://example.com/some_file.html

应该现在看起来像这样:

//example.com/some_file.html.  

这适用于绝对路径和相对路径。
对于您设置的EE文件上传目录路径也是如此。确保更改这些目录的URL,使其看起来像这样。
//example.com/path/to/your/upload/directory

瞧,你应该可以开始了 :)


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