На странице публикуемого поста размещается динамический баннер (баннер берется из базы данных). Под авторизованным пользователем загружается нормально, но если захожу по URL без авторизации, то почему-то перенаправляет на сайт/логин. Если я удалю код баннера со страницы, то контент поста загружается нормально для любого пользователя, независимо от того, авторизован он или нет. Проблема возникает как в продакшене, так и на локальной машине.
URL страницы:
http://site.local/ru/topic/view?title=anons
Контроллер:
class TopicController extends Controller {
public $layout = 'main';
public $defaultAction = 'index';
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
['allow' => true, 'actions' => ["create", "update", 'admin'], 'roles' => ['@']],
['allow' => true, 'actions' => ["index", "view"], 'roles' => ['?', '@']]
]
]];
}
/**
* Displays a particular model.
* @param string $title the title of the model to be displayed
*/
public function actionView($title) {
$model = Topic::findOne(["code"=>$title]);
if (empty($model))
return $this->redirect(['/404']);
if (!$model->published && (Yii::$app->user->isGuest))
return $this->redirect(['/404']);
if ($model->paid > 0)
Yii::$app->params["nofollow"] = 1;
return $this->render('view', array(
'model'=>$model
));
}
Просмотр:
Просмотр баннера/просмотра:
id?>" data-bid="">
[url=" title="" target='_blank' rel="nofollow">
[img]" alt="" loading="lazy">
[/url]
Если я закомментирую строку
$banner = Banner::getRandom($type);
Тогда все работает как надо - страница загружается и не требует авторизации.
Поиск по баннеру:
public static function getRandom($type = "main_banner") {
$lang = Yii::$app->language;
$country = self::getCountry();
$now = date("Y-m-d");
$tbl = self::tableName();
$tbs = Service::tableName();
$sql = "select $tbl.* from $tbl
inner join $tbs on $tbl.serviceid = $tbs.id
where published = 1
and $tbs.code like :position
and $tbs.lang = :lang
and (finaldate is null or
(initialdate = :now))
and (options is null or length(options) = 0 or options like :country)
order by rand()
limit 1";
$postfix = ("ru" == $lang) ? "" : "_".$lang;
$query = self::findBySql($sql, [
":position"=>$type.$postfix,
":lang"=>$lang,
":now"=>$now,
":country"=>"%".$country."%"
]);
return $query->one();
}
Не могу понять, в чем проблема, пожалуйста, помогите. Если баннера нет, то страница загружается нормально для любого пользователя – авторизованного или гостя. Если есть баннер, то авторизованный пользователь видит и страницу, и баннер, но гость почему-то перенаправляется на сайт/логин
private static function getCountry() {
$ip = Yii::$app->request->userIP;
$geo = new SxGeo(Yii::getAlias('@data/SxGeo.dat'), SXGEO_BATCH);
return $geo->get($ip);
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... o-everyone