@donotar
php

Как сделать редирект без смены url?

Суть такова:

есть url c GETом. http://test.ru/?s%5bcategory%5d=8
нужно чтоб сервер получал его при таком запросе: test.ru/komnata

какое правило написать в htaccess ?
Т.е. чтоб сервер получал get но не выводил его в url

Регулярки не нужны, у меня всего несколько статичных страниц с такими ключ-значениями

Сейчас пока так:
RewriteCond %{REQUEST_URI} /studiya/
RewriteRule ^(.*)$ /?s\[category\]=4\&s\[kinds\]\[\]=7 [R=301,L]


Это работает, но в url - не красиво. Выводится гет. Т.е. это просто переадресация. А ведь необходимо seo.
Кстати, используется yii2 - активен ЧПУ urlManager но как туда впихнуть get - ума не приложу.

Заранее спасибо.
  • Вопрос задан
  • 1206 просмотров
Решения вопроса 1
Isolution666
@Isolution666
Full-Stack Developer
Зная вашу версию, объясняю, есть в urlManager роли, которые надо указать. Если в ролях используются get запросы, тогда надо учитывать, число это или строка, если число, ставим значение 'd' (digital) если это строка,указываем значение 'w' (word), как в примере:

'urlManager'=> [
            'enablePrettyUrl' => true,
            'showScriptName' => false,            
                'rules'=> [
// возвратит название домена, без слэша ( 1 )
                    '' => 'site/index',
// возвратит экшен без названия папки контроллера ( 2 )
                    '<action:(login|logout|new|index|contact)>' => 'site/<action>',
                    '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
                    '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                    '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
// возвратит get запрос с ссылкой, у которой переменная $link отобразит строку ( 3 )
                    'site/news/<link:\w+>' => 'site/news',
                ],            
        ],

путь к данным параметрам /frontend/config/main.php

в контроллере /frontend/controllers/SiteController.php
public function actionNews($link = '') {
            // делаем get запрос
            $get = News::find()->where(['link' => $link])->one();
            return $this->render('news', ['link' => $link, 'get' => $get,]); 
	}

естественно не забыть указать узы для класса, и создать во вьюхе файл news.php

В самом файле все get-переменные будут выглядеть примерно так:
<?=$get->header;?>

понятно, что $get - это переменная делающая запрос в БД, а header - переменная и название столбца в таблице БД, из которой передаётся значение по переменной $link а не $id !!!
Получится что-то типа:

// это для примера, писать не надо
<?php 
$link = 'first';
?>
http://mysite.host/frontend/web/site/news/first


Если хотите убрать /frontend/web/ , придётся поменять session и request, это может привести к потере директорий для многих стилей и скриптов, и перекроет кислород бекэнд разделу, но можно сделать модуль, создать свой лэяут и отделить во фронтэнде этот раздел, чтобы он был как бы бэкэндом, в тоже время папки с админкой будут во фронтэнде, операция сложная и требует знаний архетектуры Yii2, знания я черпаю из документации, хоть она и на английском, но там есть знакомые фрагменты кода Yii2 и даже описаны примеры и как и что применить.
В конечном итоге я добился вида ссылок:

mysite.host/site/news/first - при get-запросе, случай ( 3 )
и
mysite.host/news - при отображении страницы из экшена. Случай ( 2 )
--
Смотреть выше.
Успехов вам ))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы