Перейти к публикации

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


Рекомендованные сообщения

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

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

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

 

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

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

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, russhe сказал:

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

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

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

 

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

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

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

Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Изменено пользователем russhe
Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

Ссылка на сообщение
Поделиться на других сайтах
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, проверь настройки редиректа на сервере

Ссылка на сообщение
Поделиться на других сайтах

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

 

В файле 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'] );
}

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

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

Ссылка на сообщение
Поделиться на других сайтах
  • 1 год спустя...

Я столкнулся с подобной проблемой. Решение от "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.

 

Изменено пользователем maksror
Ссылка на сообщение
Поделиться на других сайтах
16 часов назад, maksror сказал:

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

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

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

Ответ таков:

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

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

 

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

 

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

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

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

Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

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

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

Ссылка на сообщение
Поделиться на других сайтах
15 минут назад, maksror сказал:

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

 

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

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

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

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

Цитата

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

 

 

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...