Jump to content
Sign in to follow this  
russhe

{full-link} формирует ссылки с https

Recommended Posts

Здравствуйте, тег {full-link} формирует ссылки с https, хотя протокол отключен.

Наблюдается как в коротких новостях, так и через тег {custom ..}

Пример: http://www.itdom-nn.ru/news/

 

В базе данных смотрел, ничего такого нет. Версия php 5.4.16, может из-за этого? Если из-за версии, можно ли как-то это исправить не меняя версию?

Заранее благодарен за ответы.

Share this post


Link to post
Share on other sites
1 час назад, russhe сказал:

Здравствуйте, тег {full-link} формирует ссылки с https, хотя протокол отключен.

Наблюдается как в коротких новостях, так и через тег {custom ..}

Пример: http://www.itdom-nn.ru/news/

 

В базе данных смотрел, ничего такого нет. Версия php 5.4.16, может из-за этого? Если из-за версии, можно ли как-то это исправить не меняя версию?

Заранее благодарен за ответы.

Дело не в базе, проверь в настройках домена наличие сертификата, если раньше был на https то попробуй провести перестройку новостей

Share this post


Link to post
Share on other sites

Перестроение новостей не помогло, в навигации смотрю так же ссылки с https, думаю что все же в версии php проблема. Переносил с другого домена, на нем работает без проблем. Может можно как-то глобально это отключить в дле не меняю версию? 

 

В link rel="canonical" так же ссылка с https

Edited by russhe

Share this post


Link to post
Share on other sites

Смотрю информацию по php и вижу:
SCRIPT_URI https://www.itdom-nn.ru/url.php

_SERVER["SCRIPT_URI"]https://www.itdom-nn.ru/url.php

 

Хотя фактически обращаюсь к скрипту без https, видимо что-то с настройками сервера? Можно в DLE что-то поправить что бы он принудительно брал http? 

Share this post


Link to post
Share on other sites
32 минуты назад, russhe сказал:

Смотрю информацию по php и вижу:
SCRIPT_URI https://www.itdom-nn.ru/url.php

_SERVER["SCRIPT_URI"]https://www.itdom-nn.ru/url.php

 

Хотя фактически обращаюсь к скрипту без https, видимо что-то с настройками сервера? Можно в DLE что-то поправить что бы он принудительно брал http? 

возможно в настройках сервера стоит редирект на https, проверь настройки редиректа на сервере

Share this post


Link to post
Share on other sites

Редиректа нет, так бы с главной и статических страниц так же редиректило, тут именно урл не верно формируется из-за этого. Доступа к серверу нет, решил следующим образом.

 

В файле engine\init.php 80-82 строка заменил:

if( isSSL() AND stripos( $config['http_home_url'], 'http://' ) !== false ) {
	$config['http_home_url'] = str_replace( "http://", "https://", $config['http_home_url'] );
}

На:

if( isSSL() AND stripos( $config['http_home_url'], 'http://' ) !== false ) {
	$config['http_home_url'] = str_replace( "http://", "http://", $config['http_home_url'] );
}

Это исправило формирование урл на сайта, в ссылках категории, канонических страницах и навигации.

 

Дальше в файле engine/ajax/controller.php на 117-123 строки заменил:

if (strpos($config['http_home_url'], "//") === 0) {
	$config['http_home_url'] = isSSL() ? $config['http_home_url'] = "https:".$config['http_home_url'] : $config['http_home_url'] = "http:".$config['http_home_url'];
} elseif (strpos($config['http_home_url'], "/") === 0) {
	$config['http_home_url'] = isSSL() ? $config['http_home_url'] = "https://".$_SERVER['HTTP_HOST'].$config['http_home_url'] : "http://".$_SERVER['HTTP_HOST'].$config['http_home_url'];
} elseif( isSSL() AND stripos( $config['http_home_url'], 'http://' ) !== false ) {
	$config['http_home_url'] = str_replace( "http://", "https://", $config['http_home_url'] );
}

На:

if (strpos($config['http_home_url'], "//") === 0) {
	$config['http_home_url'] = isSSL() ? $config['http_home_url'] = "http:".$config['http_home_url'] : $config['http_home_url'] = "http:".$config['http_home_url'];
} elseif (strpos($config['http_home_url'], "/") === 0) {
	$config['http_home_url'] = isSSL() ? $config['http_home_url'] = "http://".$_SERVER['HTTP_HOST'].$config['http_home_url'] : "http://".$_SERVER['HTTP_HOST'].$config['http_home_url'];
} elseif( isSSL() AND stripos( $config['http_home_url'], 'http://' ) !== false ) {
	$config['http_home_url'] = str_replace( "http://", "http://", $config['http_home_url'] );
}

Это исправило проблему формирования урл в админке при загрузке картинок на сервер.

Решал методом научного тыка, возможно что-то выплывет еще в процессе работы, возможно можно это сделать проще, не силен в программировании.

Share this post


Link to post
Share on other sites
Posted (edited)

Я столкнулся с подобной проблемой. Решение от "russhe" имеет место быть, но не известно какие последствия оно будет иметь в будущем, тем более если потребуется перенести проект на HTTPS протокол. В ходе своего дебага я капнул немного глубже и нашёл причину проблемы, по крайней мере для моего случая. Думаю, что проблема иногда возникает у пользователей, поэтому опубликую своё решение.

Как заметил "russhe" в посте выше проблема возникает на этом этапе(engine\init.php

if( isSSL() AND stripos( $config['http_home_url'], 'http://' ) !== false ) {
	$config['http_home_url'] = str_replace( "http://", "https://", $config['http_home_url'] );
}

Но причина проблемы не в замене http на https, а в самой проверке. Из этого блока кода проблемной(у меня) являлась проверка isSSL(). Данная функция описана в файле engine/modules/functions.php (строки 3093-3103):

 function isSSL() {
     if( (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
         || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
         || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
         || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443)
         || (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && $_SERVER['HTTP_X_FORWARDED_PORT'] == 443)
         || (isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https')
                 || (isset($_SERVER['CF_VISITOR']) && $_SERVER['CF_VISITOR'] == '{"scheme":"https"}')
                 || (isset($_SERVER['HTTP_CF_VISITOR']) && $_SERVER['HTTP_CF_VISITOR'] == '{"scheme":"https"}')
     ) return true; else return false;
 }

Как проверить, у вас что проблема именно в функции isSSL():

1. Создаём скрипт со следующим содержимым:

<?php
define("DATALIFEENGINE",true);
include_once("engine/modules/functions.php");
var_dump(isSSL());

2. Обращаемся к данному скрипту через браузер. Если вы обращались по HTTP протоколу, но получили ответ bool(true), то у вас проблема о которой я говорю.

 

Проблема заключается в переменных веб-серверов($_SERVER["VARIABLE"]). Для примера рассмотрю проверку одной такой переменной. В условиях указано $_SERVER['HTTPS'] !== 'off'. Проверки этой переменной на совпадение с Off нет(внимание на регистр off != Off). Как указывать off или Off выбирает системный администратор сервера(оба варианта имею место быть и являются правильными) и если вы используете, например shared хостинг менять значение на уровне веб-серверов не будут. Проверить такая проблема у вас или нет можно простым скриптом:

<?php
var_dump($_SERVER['HTTPS']);

После чего к скрипту нужно обратиться через браузер(запуск через php-cli не даст нужной информации) по HTTP протоколу. Есть вероятность, что вы получите ответ:

string(3) "Off"

Соответственно на этом этапе мы и получаем неправильную проверку протоколу, ведь off != Off. Такую же проверку вы можете сделать для других переменных, если есть желание чётко понять значение какой переменной ломает проверку. Я решил проблему с помощью функции strtolower изменив функцию isSSL() следующим образом:

function isSSL() {
     if( (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
         || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https')
         || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && strtolower($_SERVER['HTTP_X_FORWARDED_SSL']) == 'on')
         || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443)
         || (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && $_SERVER['HTTP_X_FORWARDED_PORT'] == 443)
         || (isset($_SERVER['REQUEST_SCHEME']) && strtolower($_SERVER['REQUEST_SCHEME']) == 'https')
                 || (isset($_SERVER['CF_VISITOR']) && strtolower($_SERVER['CF_VISITOR']) == '{"scheme":"https"}')
                 || (isset($_SERVER['HTTP_CF_VISITOR']) && strtolower($_SERVER['HTTP_CF_VISITOR']) == '{"scheme":"https"}')
     ) return true; else return false;
}

Дальше нужно отчистить кэш движка (engine/cache/system/). 

Надеюсь данное решение поможет кому-то из пользователей DLE.

 

Edited by maksror
  • Upvote 1

Share this post


Link to post
Share on other sites
16 часов назад, maksror сказал:

Как указывать off или Off выбирает системный администратор сервера(оба варианта имею место быть и являются правильными)

Откуда такое утверждение?

От горе администраторов нужно бежать, а не соглашаться с их "мегаопытом".

Ответ таков:

В 23.06.2020 в 10:10, celsoft сказал:

Системный администратор сервера "скреативил" прописал значение настроек сервера по непонятным причинам с большой буквы, их нужно либо не ставить в данном случае, либо как принято, писать значения маленькими буквами. Он мог написать там и OFF и OfF для сервера это все равно, а вот для корректного чтения этих настроек уже могут быть проблемы. Как правило так не не креативят в настройках сервера. 

 

За несколько лет существования этой функции, это первый такой "креатив" на практике. В DLE будет добавлены механизмы контроля от подобной вольной интерпретации написания серверный настроек.

 

17 часов назад, maksror сказал:

(оба варианта имею место быть и являются правильными)

Если бы такой вариант был "правильным" - то тогда бы большинство пользователей сайто ДЛЕ сталкивались с подобной проблемой.

Share this post


Link to post
Share on other sites

Данный топик открывал не я, значит как минимум у двух пользователей есть такая проблема) Бежать от "горе" администратора из-за этого я не собираюсь, уж извините. Между стабильность и дебагом софта длиною в два часа, я выберу второе) Повторюсь топик создавал не я, я лишь поделился своим способом решения, который на мой взгляд показался правильным. Если мои убитые пару часов помогут другим пользователям я буду рад, если они решат просто сменить сервак/хостера мне всё равно)

On 6/30/2020 at 12:44 PM, kamensk said:

Откуда такое утверждение?

 

Вот тут пожалуй немного уточню, я не нашёл какого-либо стандарта по заданию данных переменных окружения веб-серверов. Да, есть дефолт, который редко меняют. Но с учётом того, что многие веб-серваки это открытый софт(не говоря уже о самописах) который поддерживает плагинистость, то вариаций может быть много.

Предлагаю не разводить философские диалоги на тему того что правильно, а что нет. Расценивайте мой комментарий как решение частного(и редкого) случая. На звание истины в последней инстанции я не претендую)

Share this post


Link to post
Share on other sites
15 минут назад, maksror сказал:

Повторюсь топик создавал не я, я лишь поделился своим способом решения,

 

Несомненно вы правильно делаете, что делитесь найденным путем решения проблемы.

22 минуты назад, maksror сказал:

Предлагаю не разводить философские диалоги на тему того что правильно, а что нет.

Зачем разводить диалоги - разрабы  уже взяли на заметку "отсебятину" хостеров-админов.

Цитата

В DLE будет добавлены механизмы контроля от подобной вольной интерпретации написания серверный настроек.

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...