HTTPS& HTTP ExpressionEngine站点URL标记

时间:2012-11-02 15:25:23

标签: expressionengine

我今天发现,如果你访问一个在文档头中的css链接路径中使用{site_url}标记的EE网站,那么如果你输入https而不是网站,该网站就无法加载CSS文件HTTP。

我已经通过使用htaccess文件来强制转到http,但我只是想知道EE中是否有一个设置可以更改以使两者都有效?

这只发生在Chrome和IE上,我猜测取决于您的浏览器设置是否允许安全。

6 个答案:

答案 0 :(得分:7)

我对这个问题得到了很多帮助previously。我希望它现在也对你有用。

答案 1 :(得分: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中出现“此页面包含安全和非安全项目”这一错误消息,并将所有资产请求保留在同一协议中。

来自here的更多信息:

  

没有方案的相对URL(http:   或RTps :)有效,按RTF 3986:   第4.2节。如果客户端呛到它,   那是客户的错,因为   他们没有遵守URI   RFC中指定的语法。

     

您的示例有效且应该有效。   我已经使用了相对URL方法   我自己在交通繁忙的网站上   没有投诉。我们也是   在Firefox,Safari中测试我们的网站   IE6,IE7和Opera。这些浏览器全部   了解URL格式

答案 2 :(得分:5)

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

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

如果你尝试这样做有用吗?

答案 3 :(得分: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's Config Bootstrap file或文章Configuring ExpressionEngine for multiple servers。对于您可以在config.php中设置的所有路径,请参阅EE2 Config Overrides

答案 4 :(得分:1)

我使用Nginx。

我不知道为什么但是如果我使用绝对URL(完整路径)而不是相对(/来启动域as CreateSean said处的字符串as Deviarte said,那么资源在各种浏览器中的加载速度要快得多,{ {1}}在协议comment by unexplainedBacn above处启动字符串)(或者他们使用相对URL加载速度较慢?我不知道。)。因此,他们的解决方案/实践(我曾经做过的事情......现在仍然这样做)都不适合我的环境。

相反,我所做的是config.php中的以下内容:

//

请注意,如果尚未存在,则可能必须向PHP提供scheme_url。如果像我一样你使用的是php-fpm,只需在你的配置中将其添加到你的nginx站点配置中所需的位置:

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

编辑:

环顾一下bootstrap / configs,有些人使用将协议添加到配置变量的方法(例如{{3}})。在Nginx中默认情况下没有HTTPS服务器变量,在ssl下的php的虚拟主机配置中添加以下内容:

    fastcgi_param scheme_url "$scheme://$host/";

答案 5 :(得分: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

瞧,你应该好好去:)