我今天发现,如果您访问一个在文档头部的 css 链接路径中使用 {site_url} 标签的 EE 站点,如果您键入 https 而不是 http,该站点将无法加载 CSS 文件。
我已经通过使用 htaccess 文件强制进入 http 来解决这个问题,但我只是想知道 EE 中是否有一个设置可以更改以使两者都工作?
这仅发生在 Chrome 和 IE 上,我猜这取决于您的浏览器设置为允许安全性。
我今天发现,如果您访问一个在文档头部的 css 链接路径中使用 {site_url} 标签的 EE 站点,如果您键入 https 而不是 http,该站点将无法加载 CSS 文件。
我已经通过使用 htaccess 文件强制进入 http 来解决这个问题,但我只是想知道 EE 中是否有一个设置可以更改以使两者都工作?
这仅发生在 Chrome 和 IE 上,我猜这取决于您的浏览器设置为允许安全性。
我以前在这个问题上得到了一些很大的帮助。我希望它现在对你也有用。
很少有人知道您可以将协议相关的 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 中出现可怕的“此页面包含安全和非安全项目”错误消息,从而使您的所有资产请求保持在同一协议中。
更多信息来自这里:
根据 RTF 3986:第 4.2 节,没有方案(http: 或 https:)的相对 URL 是有效的。如果客户端对此感到窒息,那么这是客户端的错,因为它们不符合 RFC 中指定的 URI 语法。
你的例子是有效的,应该可以工作。我自己在流量很大的网站上使用了这种相对 URL 方法,并且投诉为零。此外,我们在 Firefox、Safari、IE6、IE7 和 Opera 中测试我们的网站。这些浏览器都理解 URL 格式
当我加载 CSS 和 JS 时,我从不使用我只是相对设置它的域。例如:
<link rel="stylesheet" href="/layout/styles/layout.css" >
如果你试试这个,那行得通吗?
您可以在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
我使用 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 和一些使用将协议添加到配置变量的方法(例如上面 unexplainedBacn 的注释)。默认情况下,Nginx 中没有 HTTPS 服务器变量,在 ssl 下的 php 虚拟主机配置中添加以下内容:
fastcgi_param HTTPS on;
全部,
以下是我如何使用 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 用于 EE 中的 {stylesheets} 和 {paths} 的。
谚语“最后一件事”:
如果您仍然收到非 SSL 警告,只需查看源代码并在源代码中搜索“http://”。这些是罪魁祸首。它们是未使用 base_url/site_url 变量设置的硬编码链接。
您需要在您的帖子/模板/变量/片段中找到这些 http 调用,并用简单的 // 替换这些调用。
所以打电话给
http://example.com/some_file.html
现在应该是这样的:
//example.com/some_file.html.
这适用于绝对和相对 URL。
您设置为 EE 文件上传目录的路径也是如此。确保将这些目录的 url 更改为如下所示
//example.com/path/to/your/upload/directory
瞧,你应该很高兴:)