Тег URL-адреса сайта HTTPS и HTTP ExpressionEngine

Сегодня я обнаружил, что если вы посещаете сайт EE, который использует тег {site_url} в пути ссылки css в заголовке документа, сайт не может загрузить файл CSS, если вы введете https, а не http.

Я обошел это, используя файл htaccess для принудительного подключения к http, но мне просто интересно, есть ли в EE параметр, который вы можете изменить, чтобы оба работали?

Это произошло только в Chrome и IE, я предполагаю, что зависит от того, что ваш браузер настроен для обеспечения безопасности.


person Gareth    schedule 02.11.2012    source источник


Ответы (6)


Когда я загружаю CSS и JS, я никогда не использую домен, который я просто задал относительно. Например:

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

Если вы попробуете это, это сработает?

person CreateSean    schedule 02.11.2012
comment
Гарет может использовать {stylesheet=}, чтобы воспользоваться преимуществами этого, и в этом случае поведение, о котором он упоминает, будет проявляться. - person Scott Hepler; 02.11.2012
comment
Привет, Шон, да, это сработало нормально, и это то, что я в итоге сделал. Ответ Deviarte выше выглядит интересным решением? - person Gareth; 07.11.2012

Я получил большую помощь по этой проблеме ранее. Я надеюсь, что это полезно и для вас сейчас.

person Scott Hepler    schedule 02.11.2012
comment
Привет, Скотт, заметил, что ты помог с несколькими вопросами по EE. Было бы здорово, если бы вы могли поддержать наше предложение EE Stack Exchange здесь: area51.stackexchange.com/proposals/46387 / (нам нужны люди с репутацией более 200) - person Adrian Macneil; 05.11.2012

Мало кто знает, что вы можете использовать URL-адреса, относящиеся к протоколу, для ресурсов.

Пример:

<link rel="stylesheet" href="//www.site.com/site.css">
<script type="text/javascript" src="//www.site.com/site.js"></script>

Если браузер просматривает страницу в SSL через HTTPS, он будет запрашивать этот ресурс с помощью протокола https, в противном случае он будет запрашивать его с помощью HTTP.

Это предотвращает это ужасное сообщение об ошибке «Эта страница содержит как безопасные, так и небезопасные элементы» в IE, сохраняя все ваши запросы активов в одном и том же протоколе.

больше информации из здесь:

Относительный URL-адрес без схемы (http: или https:) действителен в соответствии с RTF 3986: раздел 4.2. Если клиент подавится этим, то это вина клиента, потому что он не соответствует синтаксису URI, указанному в RFC.

Ваш пример действителен и должен работать. Я сам использовал этот метод относительных URL-адресов на сайтах с интенсивным трафиком и не получил никаких жалоб. Также мы тестируем наши сайты в Firefox, Safari, IE6, IE7 и Opera. Все эти браузеры понимают этот формат URL

person Victor Gutierrez    schedule 02.11.2012
comment
Это хорошее и элегантное решение! Но будьте осторожны: EE явно не нравится, когда site_url устанавливается таким образом, FWIW. - person Scott Hepler; 03.11.2012
comment
Спасибо за этот Deviarte, я предполагаю, что если вы затем захотите использовать глобальную переменную в своих шаблонах, вам просто нужно создать такую, которая использует //www.site.com, потому что стандартный {site_url} просто выводит http? - person Gareth; 07.11.2012

Вы можете использовать PHP в файле system/expressionengine/config/config.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, см. в разделе Config_Overrides" rel="nofollow">Переопределения конфигурации EE2.

person unexplainedBacn    schedule 02.11.2012

Я использую Nginx.

Я не знаю почему, но ресурсы загружаются значительно быстрее в различных браузерах, если я использую абсолютные URL-адреса (полный путь) вместо относительных (/, чтобы начать строку с домена как сказал CreateSean, // чтобы начать строку с протокола как сказал Deviarte) (или дело в том, что они загружаются медленнее с относительными URL-адресами? Я не знаю.). Следовательно, ни одно из их решений/практик (обе вещи, которые я делал... и делаю до сих пор) не являются предпочтительными для моих сред в наши дни.

Вместо этого я сделал следующее в config.php:

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

Обратите внимание, что вам, возможно, придется предоставить PHP схему_url, если она еще не существует. Если, как и я, вы используете php-fpm, просто добавьте это в свою конфигурацию по мере необходимости в конфигурации вашего сайта nginx:

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

редактировать:

Глядя на bootstrap/configs, некоторые используют метод добавления протокола к переменным конфигурации (например, комментарий unexplainedBacn выше ). В Nginx по умолчанию нет переменной сервера HTTPS, в конфигурации вашего виртуального хоста для php под ssl добавьте следующее:

    fastcgi_param   HTTPS   on; 
person notacouch    schedule 08.11.2012

Все,

Вот как я использовал Apache и файл Config.php для перезаписи URL-адресов, чтобы не вызывать «предупреждения о не-SSL-контенте» из браузеров. Я все еще использую переменные {path} и ​​{stylesheet} в своих шаблонах, потому что они слишком хороши, чтобы отказываться от них :)

В файле htaccess Apache:

# 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.

Пословица "Одна последняя вещь":

Если вы по-прежнему получаете предупреждение об отсутствии 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

И вуаля, вы должны быть готовы к работе :)

person Benjamin Mailian    schedule 21.02.2013