.htaccess, [L], Yii2 и картинки

Различные вопросы по установке и настройке фреймворка, конфигурции веб-сервера и IDE.
Ответить
Аватара пользователя
Maxim Glushko
Сообщения: 81
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

.htaccess, [L], Yii2 и картинки

Сообщение Maxim Glushko » 2018.07.17, 15:35

.htaccess

Код: Выделить всё

RewriteRule ^(img/.*\.(jpe?g|png|bmp|gif))$ /site/img/$1 [L]
В правилах роутов в конфиге - не получается ни одним из способов:

Код: Выделить всё

'/site/img/<url:.+>' => '/site/img/<url>',

Код: Выделить всё

'/site/img/<url:.+>' => '/site/img',

Код: Выделить всё

'/site/img' => '/site/img',
Выдаёт 404 страницу. Не видит actionImg()
Я так понимаю, при задании [L] $_SERVER['REQUEST_URI'] остаётся адресом картинки, поэтому роуты в конфиге работать не могут, т.к. они должны распарсивать $_SERVER['REQUEST_URI']. В котором нет информации о контроллере, методах и параметрах.

Есть ли возможность победить ситуацию? В чистом php такое получалось
Т.е. нужно на запрос картинки выдать метод контроллера, который уже будет думать, какую картинку дать.

someweb
Сообщения: 540
Зарегистрирован: 2017.03.09, 10:12

Re: .htaccess, [L], Yii2 и картинки

Сообщение someweb » 2018.07.17, 16:20

Код: Выделить всё

'img/<name>' => 'site/img',
В action придет параметром $name
RewriteRule уберите.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Аватара пользователя
Maxim Glushko
Сообщения: 81
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: .htaccess, [L], Yii2 и картинки

Сообщение Maxim Glushko » 2018.07.17, 16:22

Я не хочу все запросы к картинкам обрабатывать в php.
Рядом с rewriteRule стоят условия несрабатывания на поисковые сайты и другие условия.
Как, например:

Код: Выделить всё

RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yandex\.(com|ru|ua|by|net|kz) [NC]

skynin
Сообщения: 186
Зарегистрирован: 2017.12.12, 10:09

Re: .htaccess, [L], Yii2 и картинки

Сообщение skynin » 2018.07.17, 16:59

Maxim Glushko писал(а):
2018.07.17, 15:35
.htaccess

Код: Выделить всё

RewriteRule ^(img/.*\.(jpe?g|png|bmp|gif))$ /site/img/$1 [L]
В правилах роутов в конфиге - не получается ни одним из способов:
процитирую себя же :)

Ваш Апач не пропускает запросы к Yii вообще, так что конфиги Yii пока ни при чем.

Как настроить URL manager без ошибки 404

там же Как на самом деле работает mod_rewrite. Пособие для продолжающих

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

Аватара пользователя
Maxim Glushko
Сообщения: 81
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: .htaccess, [L], Yii2 и картинки

Сообщение Maxim Glushko » 2018.07.17, 18:29

Т.е. из апача в Yii посылать с картинок можно только через [R=301,L]
Но не через [L]
Так?

Код: Выделить всё

RewriteRule ^(img/.+\.(jpe?g|png|bmp|gif))$ /index.php/site/img/$1 [R=301,L]
Вот так с переменным успехом получается.
Вставил картинку в <img>, в контроллере отдал другой контент, в месте вставки по виду новая картинка, а по src якобы старая.
Мишн комплит.

P.S. Уж преждевеременно начал горевать о том, что зря писал код на yii и что эту часть придётся на чистом php ваять, как и прежде.

skynin
Сообщения: 186
Зарегистрирован: 2017.12.12, 10:09

Re: .htaccess, [L], Yii2 и картинки

Сообщение skynin » 2018.07.17, 18:48

Maxim Glushko писал(а):
2018.07.17, 18:29
Т.е. из апача в Yii посылать с картинок можно только через [R=301,L]
Но не через [L]
Так?
давайте с азов. извините что мне показалось что есть с этим некоторые сложности. обычное дело кстати, у задающих вопросы :)

1. когда приходит запрос на tcp соединение, кто его обрабатывает?
веб-сервер. далее просто апач.
по этому соединению шлется http запрос
кому он шлется?
тому с кем установлено, то есть - апачу
апач читает из него URL ресурса, который запрашивается.
и, в зависимости от настроек, решает, что ему ответить.
например [R=301,L]
что оно значит?
Обозначение [R=301,L] означает: перенаправить клиента и отправить ему код статуса 301 (R=301) и сделать это правило последним (L).

2. после 301 начинается опять с пункта 1, запрос ресурса, который был послан по 301
если вы опять послали картинку, то опять до Yii ничего не дойдет, апач обработает запрос сам :)
если шлете тот же ресурс - апач, а чаще браузер просто выдаст - дофига чего-то редиректов. потому что вы просто зациклили его.

главное: тут никакой Yii ничего не может обработать без п1. и не Yii тоже.

даже если вы поставите голый апач, без своих настроек, и единственный index.php - все равно это апач будет решать - запустить index.php или нет
просто у него по умолчанию в настройках стоит - искать index.php и запускать его.
то есть
В чистом php такое получалось
неправда :) не бывает чистого php :)
вернее бывает конечно, если вы запустили встроеный веб сервер
php -S localhost:8000

если с этим разобрались, давайте думать дальше :)

Вам нужно объяснить апачу что
по таким условиям, критериям картинки не отдавай, а вызывай
index.php
/index.php/site/img/
то есть вы сказали апачу не дать картинку, а запустить index.php
что эту часть придётся на чистом php ваять
нет никакого чистого php
вы не можете наваять ничего на чистом php :)

только сказать апачу чтобы он отдал все запустив какой-то php файл.

но я бы не делал редиректы на /index.php/ а разобрался бы с mod_rewrite правилами :)

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

Аватара пользователя
Maxim Glushko
Сообщения: 81
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: .htaccess, [L], Yii2 и картинки

Сообщение Maxim Glushko » 2018.07.17, 18:57

skynin писал(а):
2018.07.17, 18:48
но дело хозяйское, работать будет, и ладно
Предложите вариант, чтобы работало через .htaccess.
Мне не нужно все картинки отдавать через yii.

Я сделал свой вариант, который:
1. Через .htaccess фильтрует, откуда запросили картинку
2. Если в .htaccess прошло фильтр - отдаётся картинка безо всякой обработки (и без пустой нагрузки, где она была не нужна).
3. Если фильтр не прошло - направляется на контроллер, который даёт что мне будет угодно для этих конкретных условий.
4. ПРОВЕРЕН. О чём написано выше.

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

skynin
Сообщения: 186
Зарегистрирован: 2017.12.12, 10:09

Re: .htaccess, [L], Yii2 и картинки

Сообщение skynin » 2018.07.17, 19:10

Maxim Glushko писал(а):
2018.07.17, 18:57
Предложите вариант, чтобы работало через .htaccess.
код пишу за деньги.
или когда интересно :)

настройка .htaccess неинтересна.
редко приходится вытворять что-то эдакое, и нюансы синтаксиса правил быстро забываются.
это значит что мне придется открыть доку по реврайтам модуля mod_rewrite,
и написать код вместо вас :)
так может вы сами напишите? ;)
зато один раз написавши - сможете писать сами и потом.

плюс вашей задачи я не знаю.
возможно ее вообще не так надо решать.
я о бизнес-задаче.
Maxim Glushko писал(а):
2018.07.17, 18:57
Мне не нужно все картинки отдавать через yii.
но именно это вы и сделали.

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

Аватара пользователя
Maxim Glushko
Сообщения: 81
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: .htaccess, [L], Yii2 и картинки

Сообщение Maxim Glushko » 2018.07.17, 19:36

RewriteCond решает, какую картинку сразу отдать, а какую в yii передать
выше писал

skynin
Сообщения: 186
Зарегистрирован: 2017.12.12, 10:09

Re: .htaccess, [L], Yii2 и картинки

Сообщение skynin » 2018.07.17, 19:49

Maxim Glushko писал(а):
2018.07.17, 19:36
RewriteCond
выше писал
видел.
я ведь написал что на мой вкус редиректы лишние :)
я бы попытался от них избавиться.

но если картинок мало, то почему бы и не редиректить :)

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

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

andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: .htaccess, [L], Yii2 и картинки

Сообщение andku83 » 2018.07.21, 02:31

Maxim Glushko писал(а):
2018.07.17, 18:29
Так?

Код: Выделить всё

RewriteRule ^(img/.+\.(jpe?g|png|bmp|gif))$ /index.php/site/img/$1 [R=301,L]
Так вы все изображения предлагаете пропускать через приложение.
Я бы предложил вам для полной статики оставить поведение по умолчаню, а те которые необходимо отдавать по логике хранить в недоступном извне месте либо запрашивать страницей через ваш конкретный роут, пример:
изображения все изображения лежат в web/img, и они достыпны напрямую из апача, для тех изображений у которы есть логика используйте

Код: Выделить всё

Url::to(['images/get-images', 'imgPath => 'img/logo.png'])

// в урлМенеджере настройте правило  
['pattern'=>'get-img/<imgPath>', 'route'=>'images/get-images'],
Теперь если вы обратитесь по адресу '/img/logo.png' - его отдаст апач,
А если - '/get-img/logo.png' - получите вызов вашего екшена

Аватара пользователя
Maxim Glushko
Сообщения: 81
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: .htaccess, [L], Yii2 и картинки

Сообщение Maxim Glushko » 2018.07.21, 08:08

Я не всё пропускаю, вернее, не ото всех.
Выше уже писал об этом.

Код: Выделить всё

RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !^https?://my\.site\.ua [NC] #вставить домен реального сайта
RewriteCond %{HTTP_REFERER} !^https?://(.*\.)?google\.(ae|am|at|az|ba|bg|be|by|ca|ch|cl|com|cz|de|dk|ee|es|fi|fr|ge|gr|hr|hu|ie|iq|it|kg|kz|lt|lv|md|me|mn|nl|no|pl|rt|ro|rs|ru|se|sk|si|tm|co\.id|co\.il|co\.in|co\.jp|co\.kr|co\.th|co\.uk|co\.uz|co\.ve|com\.ar|com\.co|com\.mx|com\.pe|com\.ua) [NC]
# и другие
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} /img/
RewriteRule ^(img/.+\.(jpe?g|png|bmp|gif))$ /hotlinking/$1 [R=301,L]
Цель - использовать хотлинкеров.

Ответить