Перейти к содержанию
Официальный форум поддержки Simpla

Убираем Токен Из Адреса Изображения


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

Интересный приемчик.
В плане надежности - недопущения несанкционированного ресайза - это, в отличие от первого способа этой темы, должно работать очень даже правильно.
А в плане всего остального, ИМХО, это классический пример того, как нельзя делать.
 

Должно быть, Вы решили пошутить...

Ссылка на сообщение
Поделиться на другие сайты
  • Ответов 103
  • Дата создания
  • Последний ответ

Лучшие авторы в теме

Лучшие авторы в теме

Интересный приемчик.

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

А в плане всего остального, ИМХО, это классический пример того, как нельзя делать.

 

Должно быть, Вы решили пошутить...

 

а что вас не устраивает? токены всех запрашиваемых изображений пишутся в сессию, если есть запрос к ресайзу используем сессии, если нет просто чистим их

 

ну да, тут ведь вопрос еще с выгрузками... надо подумать)

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

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

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

а что вас не устраивает? токены всех запрашиваемых изображений пишутся в сессию

 

Как раз это и не устраивает.

Посмотрим на постейшую типовую ситуацию, когда, например, сайт стабильно работает,  товары более-менее постоянны, изображения товаров давно не обновлялись, и все изображения нужных размеров давно сгенерированы.

Как Вы правильно заметили, "токены всех запрашиваемых изображений пишутся в сессию", то есть при открытии посетителем, например, страницы категории, в сессию запишутся пару десятков токенов. При открытии другой категории - еще пару десятков. Если на сайте много товаров - сессия начнет пухнуть от совершенно бесполезных данных.  Такое я и называю классическим примером того, как делать нельзя и за что программиста надо бить долго и сильно.

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

Сессии при каждом запросе очищаются их количество в одном запросе ограничивается количеством картинок на странице. Как раз именно в этом проблем совсем нет

 

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

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

Да, упустил этот момент.  Значит, мое утверждение "сессия начнет пухнуть" - преувеличение.

Но остается другое - в приведенном мной примере при каждом вызове index.php  Вы очищаете токены в сессии и тут же записываете их снова.  Каждый раз наполняете и очищаете сессию данными, которые совершенно не нужны в работе.

 

Есть и более интересный момент. Нередко на сайте используются одни размеры изображений товара, при выгрузке на Яндекс маркет - другие. В этом случае Ваш метод, насколько я понимаю, приведет к тому, что URL-ы картинок, которые пойдут в Яндекс маркет, окажутся битыми. Сомневаюсь, что кому-то из сайтовладельцев это понравится...

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

Есть и более интересный момент. Нередко на сайте используются одни размеры изображений товара, при выгрузке на Яндекс маркет - другие. В этом случае Ваш метод, насколько я понимаю, приведет к тому, что URL-ы картинок, которые пойдут в Яндекс маркет, окажутся битыми. Сомневаюсь, что кому-то из сайтовладельцев это понравится...

 

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

 

public function resize_modifier($filename, $width=0, $height=0, $set_watermark=false, $s=true)
{
    $resized_filename = $this->image->add_resize_params($filename, $width, $height, $set_watermark);
    $resized_filename_encoded = $resized_filename;

    if(substr($resized_filename_encoded, 0, 7) == 'http://')
	    $resized_filename_encoded = rawurlencode($resized_filename_encoded);

    $resized_filename_encoded = rawurlencode($resized_filename_encoded);

    if($s)
    {
       $token = $this->config->token($resized_filename);
       if(empty($_SESSION['images_tokens']) || !in_array($token, $_SESSION['images_tokens']))
          $_SESSION['images_tokens'][] = $token;
    }
    return $this->config->root_url.'/'.$this->config->resized_images_dir.$resized_filename_encoded.(!$s?'?'.$this->config->token($resized_filename):'');
}
<?php
session_start();
require_once('../api/Simpla.php');

$filename = $_GET['file'];
$token = $_GET['token'];

$simpla = new Simpla();

if(!empty($token))
{
    if(!$simpla->config->check_token($filename, $token))
       exit('bad token');
}
else
{
    $token = $simpla->config->token($filename);
    if(empty($_SESSION['images_tokens']) || !in_array($token, $_SESSION['images_tokens']))
       exit('bad token');
}

$resized_filename =  $simpla->image->resize($filename);

if(is_readable($resized_filename))
{
	header('Content-type: image');
	print file_get_contents($resized_filename);
}

if($p->image)
print "<picture>".$simpla->design->resize_modifier($p->image, 200, 200, false, false)."</picture>
";

 

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

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

 

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

 

<?php
session_start();
require_once('../api/Simpla.php');

$filename = $_GET['file'];
$token = $_GET['token'];

$simpla = new Simpla();

if(isset($token))
{
    if(!$simpla->config->check_token($filename, $token))
       exit('bad token');
}
else
{
    $token = $simpla->config->token($filename);
    if(empty($_SESSION['images_tokens']) || !in_array($token, $_SESSION['images_tokens']))
       exit('bad token');
}

$resized_filename =  $simpla->image->resize($filename);

if(is_readable($resized_filename))
{
	header('Content-type: image');
	print file_get_contents($resized_filename);
}

[/code]
[code=auto:0]if($p->image)
print "<picture>".$simpla->design->resize_modifier($p->image, 200, 200)."?".$simpla->config->token($p->image)."</picture>
";
 

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

 

 

Я бы оценил так:

1. Совсем не изящно постоянно юзать сессию в тех случаях когда они уже не нужны.

2. Совсем не изящно в одних случаях использовать токен, в других нет - выходит непонятно почему излишнее усложнение, только пользователя путать.

3. Вариант полностью не рабочий. В нем с ходу видна детская ошибка. Надо объяснять подробнее или сами найдете?

 

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

 

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

после вашего варианта с проверкой файла на наличие при каждом запросе не вам судить об изящности и оценивать.

 

в моем примере сессия используется по назначению, просто мне бы конечно хотелось бы найти вариант более простой.

 

Когда лично у вас будет больше фантазии и примеров на данную тему, кроме как использовать давно избитый вариант, тогда и можно будет вести с вами дальнейшую беседу. а на данный момент мой интерес к вашему мнению исчерпан потому как я предложил вам обсудить а не ставить оценки, вы тут не в качестве жури. Как минимум я предложил 2 варианта реализации, от вас я не видел ничего большего кроме оценок чужой работы. Пожалуй это повод усомнится в вашей компетенции.

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

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

Главным в моем последнем сообщении был пункт

 

3. Вариант полностью не рабочий. В нем с ходу видна детская ошибка. Надо объяснять подробнее или сами найдете?

 

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

 

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

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

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

Главным в моем последнем сообщении был пункт

 

3. Вариант полностью не рабочий. В нем с ходу видна детская ошибка. Надо объяснять подробнее или сами найдете?

 

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

 

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

 

личность в данном случае играет роль (почему то я убежден в том что я говорил только о ваших профессиональных качествах), я объяснил почему - от вас нет конструктивного обсуждения, потому я сомневаюсь стоит ли с вами дальше вести обсуждение.

 

вы пишите

- вариант полностью не рабочий.

- надо объяснять подробнее или сами найдете?

В нем с ходу видна детская ошибка - особо мне нравится, есть ли смысл вести с вами беседу дальше хотя бы после этого, я очень ранимый)

 

Вот для чего мне отгадывать что вы имеете ввиду? Или мне надо писать вижу ли я ошибку - нет не вижу. Вопрос в другом - если вы ее видите почему бы сразу не написать в чем суть ошибки. Потому как я убежден что вариант 100% рабочий. Есть замечания - раскройте свою мысль максимально доходчиво для того что бы мне не приходилось искать тут философский смысл.

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

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

Главным в моем последнем сообщении был пункт

 

3. Вариант полностью не рабочий. В нем с ходу видна детская ошибка. Надо объяснять подробнее или сами найдете?

 

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

 

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

 

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

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

Или мне надо писать вижу ли я ошибку - нет не вижу.

Судя по тому, что Вы изменили пост #78, ошибку Вы увидели.

Вопрос в другом - если вы ее видите почему бы сразу не написать в чем суть ошибки.

Чтобы Вы нашли ее самостоятельно. Тем более, что она, как я отметил, детская и видна сразу (если, конечно, хоть немного стараться ее увидеть).

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

Потому как я убежден что вариант 100% рабочий.

Есть замечания - раскройте свою мысль максимально доходчиво для того что бы мне не приходилось искать тут философский смысл.

Я считаю, что сообщил Вам очень доходчиво, что ошибка примитивная и лежит на поверхности.

Извините, не ожидал, что спец Вашей квалификации не найдет такой простой ошибки через пару минут...

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

Еще раз будет такое поведение - будешь в очередной раз забанен.

Если есть ошибка - пиши конкретно, или молчи в тряпочку...

ПОСЛЕДНЕЕ предупреждение.

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

Еще раз будет такое поведение - будешь в очередной раз забанен.

Если есть ошибка - пиши конкретно, или молчи в тряпочку...

ПОСЛЕДНЕЕ предупреждение.

 

Лучше не банить а дать какое то ограничение (например: 1 сообщение в день)

тогда будет писать больше конкретики и меньше воды в постах... 

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

К сожалению, мои права позволяют мне только запретить постинг.

Ограничение - это было бы здорово.

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

Если есть ошибка - пиши конкретно...

Спасибо, замечание правильное, постараюсь впредь конкретнее.

 

1. На настоящий момент имеем: сначала было решение из #71. Потом обнаружились недостатки при работе с Ямаркет.

2. Обнаруженный недостатки подправили в #78 так: в выгрузке писать токены как ранее. Уже само по себе решение выглядит неправильно и неестественно - задача стоит изначально, чтоб токен убрать, а теперь выходит, будет убирать, но не везде.

3. Теперь поговорим о появлении картинок в поисковиках. В стандартном шаблоне Simpla product.tpl есть такой хорошо известный  код

<a href="{$product->image->filename|resize:800:600:w}" class="zoom" rel="group"><img src="{$product->image->filename|resize:300:300}" alt="{$product->product->name|escape}" /></a>

который порождает HTML типа

<a href="http://site.ru/files/products/Samsung-Galaxy-S-II.800x600w.jpg" class="zoom" rel="group"><img src="http://site.ru/files/products/Samsung-Galaxy-S-II.300x300.jpg" alt=""></a>

Так вот, при предложенном способе, при сканировании сайта поисковиком имеем риск того, что ссылка href="http://site.ru/files/products/Samsung-Galaxy-S-II.800x600w.jpg" окажется битой. Ссылка будет нормальной лишь тогда, если к моменту сканирования картинка создана. А есть немало ситуаций, когда такой картинки не будет. А битая ссылка для  поисковика - совсем не хорошо. А в  реальности у  владельца сайта будет так - часть картинок поисковиком индексировались нормально, часть - битые. И простому пользователю понять, почему так произошло и как исправить, будет ох как проблематично...

 

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

Верно, может быть такая ситуация. Последний метод не годится

Изменено пользователем DaVinci
Ссылка на сообщение
Поделиться на другие сайты
  • 3 месяца спустя...

Добрый день! Подскажите, на одном сайте доработка работает, а на другом нет. Предполагяю связано это с тем, что для товара есть 2 дефолтных изображения(1 оригинал, 1 оригинал, но сжатый). Выводится на сайте это так
 

          {if $product->image->filename_compressed}
          <a href="{$product->image->filename_compressed|resize:2000:2000:w}" class="zoom" rel="group" data-lightbox="product-images">
              <img src="{$product->image->filename_compressed|resize:500:500}" alt="{$product->name|escape}">
            </a>
          {else}
          <a href="{$product->image->filename|resize:2000:2000:w}" class="zoom" rel="group" data-lightbox="product-images">
              <img src="{$product->image->filename|resize:500:500}" alt="{$product->name|escape}">
            </a>
         {/if}

Где и что поправить, что бы он заработал?

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

В стандарной симпле адрес изображения имеет вот такой адре:

http://simpla/files/products/Samsung-Galaxy-Mini-S5570.300x300.jpg?72fa7cbe766923a198b8ad7e132e5e9f

 

Задача получить адрес без $token-на

http://simpla/files/products/Samsung-Galaxy-Mini-S5570.300x300.jpg

 

но при это запретить произвольную нарезку изображений тех размеров которые на заданы в настройках сайта.

 

Размеры изображений задаются через шаблон. Потому можно запомнить необходимые размеры в настройках.

 

в Design.php добавляем код

        $size = ($width?$width:0).'x'.($height?$height:0).($set_watermark?"w":'');
        $image_sizes = array();
        if($this->settings->image_sizes)
            $image_sizes = explode('|',$this->settings->image_sizes);
        if(!in_array($size, $image_sizes)){
            $image_sizes[] = $size;
            $this->settings->image_sizes = implode('|',$image_sizes);
        }

 

В Image.php добавляем код

        $size = ($width?$width:0).'x'.($height?$height:0).($set_watermark?"w":'');
        $image_sizes = array();
        if($this->settings->image_sizes)
            $image_sizes = explode('|',$this->settings->image_sizes);
        if(!in_array($size, $image_sizes)){
            header("http/1.0 404 not found");
            exit();
        }

 

в resize/resize.php

/*
if(!$simpla->config->check_token($filename, $token))
	exit('bad token');
*/

 

 

Более подробно смотрите на видео

 

 

Смотрите другие доработки в моем профиле

 

Хотите сказать спасибо? Вам сюда   :)

 

Спасибо!!! Воспользовался вашей доработкой, вроде все работает, но у меня почему то во всех категориях не появляется первая картинка продукции, помогите с этим явлением разобраться, не бесплатно конечно же

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

Если вопрос только в возникающих дублях в яндекс вебмасетере, можно прописать в роботсе 

 

Disallow: /files/products/*?*

все хвосты станут закрытыми, а по прямой ссылке без токена будет отдаваться 200 ОК.

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

Если вопрос только в возникающих дублях в яндекс вебмасетере, можно прописать в роботсе 

 

Disallow: /files/products/*?*

все хвосты станут закрытыми, а по прямой ссылке без токена будет отдаваться 200 ОК.

Спасибо! Помогло!!! По моему очень хорошее решение и без всяких переделок)

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

Сделал все по инструкции, исчезли после *.jpg символы.

У меня сайт перенес на другой домен, исчезли картинки, но они все существуют в папке /files/products/

 

Что в моем случае можно сделать? Если точнее проблема оказалась,
исчезают картинки, когда меняю тему на новую. И все-таки почему их не
видно?

 

http://eda-alko.ru/catalog/pod_privarku 

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

Если точнее проблема оказалась, исчезают картинки, когда меняю тему на новую. И все-таки почему их не

видно?

 

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

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

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

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

Гость
Ответить в этой теме...

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

  Разрешено использовать не более 75 эмодзи.

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

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

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

Загрузка...
×
×
  • Создать...