8

我今天发现,如果您访问一个在文档头部的 css 链接路径中使用 {site_url} 标签的 EE 站点,如果您键入 https 而不是 http,该站点将无法加载 CSS 文件。

我已经通过使用 htaccess 文件强制进入 http 来解决这个问题,但我只是想知道 EE 中是否有一个设置可以更改以使两者都工作?

这仅发生在 Chrome 和 IE 上,我猜这取决于您的浏览器设置为允许安全性。

4

6 回答 6

7

我以前在这个问题得到了一些很大的帮助。我希望它现在对你也有用。

于 2012-11-02T16:00:08.190 回答
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 中出现可怕的“此页面包含安全和非安全项目”错误消息,从而使您的所有资产请求保持在同一协议中。

更多信息来自这里

根据 RTF 3986:第 4.2 节,没有方案(http: 或 https:)的相对 URL 是有效的。如果客户端对此感到窒息,那么这是客户端的错,因为它们不符合 RFC 中指定的 URI 语法。

你的例子是有效的,应该可以工作。我自己在流量很大的网站上使用了这种相对 URL 方法,并且投诉为零。此外,我们在 Firefox、Safari、IE6、IE7 和 Opera 中测试我们的网站。这些浏览器都理解 URL 格式

于 2012-11-02T20:23:23.650 回答
5

当我加载 CSS 和 JS 时,我从不使用我只是相对设置它的域。例如:

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

如果你试试这个,那行得通吗?

于 2012-11-02T16:13:05.030 回答
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

于 2012-11-02T17:32:16.610 回答
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 和一些使用将协议添加到配置变量的方法(例如上面 unexplainedBacn 的注释)。默认情况下,Nginx 中没有 HTTPS 服务器变量,在 ssl 下的 php 虚拟主机配置中添加以下内容:

    fastcgi_param   HTTPS   on; 
于 2012-11-08T18:52:56.983 回答
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 用于 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

瞧,你应该很高兴:)

于 2013-02-21T07:17:15.530 回答