Yii + Nginx «реврайт в реврайте»

Здравствуйте.

Подскажите пожалуйста как правильно написать данное правило:

location ~ ^/(aaa|bbb|ccc) { try_files $uri $uri/ /$yii_bootstrap?$args; } location ~ ^/([a-zA-Z0-9_-]+$) { rewrite ^/([a-zA-Z0-9_-]+$) /bbb/?str=$1 last; }

Смысл кода: Если мы запрашиваем ссылку с контроллером aaa, bbb или ccc то попадаем на контроллер. Если запрашивается другая произвольная ссылка, то попадаем на контроллер с подстановкой параметра.
Все работает если отправлять на обычную ссылку /bbb.php?str=, но при таком условии переменная идет как контроллер и отрабатывает:
try_files $uri $uri/ /$yii_bootstrap?$args;

Спасибо за любую подсказку.
  • Вопрос задан
  • 4230 просмотров
Пригласить эксперта
Ответы на вопрос 2
Tehnomag
@Tehnomag
Через yii средствами роута
в config/yii

'components'=>array(
...
'urlManager'=>array(
  'urlFormat'=>'path',
  'showScriptName'=>false,
  'rules'=>array(
                '/'=>'',
                array('/aaa/default/index/id/58058', 'caseSensitive'=>false, 'pattern' => 'aaa', 'verb' => 'GET', 'parsingOnly' => true),
                array('/bbb/default/index', 'caseSensitive'=>false,  'pattern' => 'bbb.php', 'verb' => 'GET', 'parsingOnly' => true),
                array('/bbb/default/index', 'caseSensitive'=>false,  'pattern' => 'bbb', 'verb' => 'GET', 'parsingOnly' => true),
                array('/ccc/default/index', 'caseSensitive'=>false,  'pattern' => 'ccc', 'verb' => 'GET', 'parsingOnly' => true),
  ),
 ),
),


тогда по mysite.ru/aaa -> вызовет модуль aaa, котролер default, action index.

повесить на 404 обработчик
 'components'=>array(
...
'errorHandler' => array(
   // use 'site/error' action to display errors
   'errorAction' => 'site/error',
  ),
),

вызовет контроле site, метод error
там уже проверяем что выводить зависмости от кода ошибки
public function actionError()
 {
  $error=Yii::app()->errorHandler->error;
  if($error) {
   
  if(Yii::app()->request->isAjaxRequest){ 
   echo $error['message'];  
   Yii::app()->end(); 
  
  } else {

   if(!empty($error['code']) && $error['code'] == 404 && !empty($error['traces'][0]['args'][0]))
   {
    echo 'Query : '.$error['traces'][0]['args'][0];
    $this->redirect(array('bbb/index','str'=>$error['traces'][0]['args'][0]));
   }
  echo $error['message'];
 }

 }


в nginx:
location / {
        try_files $uri $uri/ /index.php?$args;
  root /var/www/site;
  index index.php index.html index.htm;
 }

 location ~ \.php$ {
   
  try_files $fastcgi_script_name =404;
  include /etc/nginx/fastcgi_params;
  fastcgi_pass   PollFPM;
  fastcgi_index index.php;
  fastcgi_param  SCRIPT_FILENAME  /var/www/site$fastcgi_script_name;
 }
Ответ написан
fredrsf
@fredrsf
Веб-разработчик (Symfony)
Подскажите плиз зачем вот эта строчка? try_files $fastcgi_script_name =404; На моем проекте это для всех не существующих файлов .php отдает 404 средствами nginx, ожно ли сделать чтобы 404 отдавалось средствами фреймворка?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы