2013-10-27 4 views
1

Я участвую в url seo в yii webapp. Я не могу достичь желаемого результата.Yii seo url rewrite urlManager и .htaccess

Прежде всего, сайт является многоязычным. Я создал языковой коммутатор, передаю параметр «lang» как значение GET в URL-адресе.

Тогда я следовал вики по этому адресу:

http://www.yiiframework.com/wiki/294/seo-conform-multilingual-urls-language-selector-widget-i18n/

  • Шаг 1) я создать класс urlManager
  • Шаг 2) Редактировать мой контроллер
  • Шаг 5) Редактировать мой конфигурационный файл

Для шага 5 я использую следующий код:

'urlManager' => array(
     'class' => 'application.components.UrlManager', 
     'urlFormat' => 'path', 
     'showScriptName' => false, 
     'urlSuffix'=>"/", 
     'rules' => array(          
      '<lang:(de|it|en|fr|es)>'=>'',         
      '<lang:(de|it|en|fr|es)>'=>'site/index',         
      '<lang:(de|it|en|fr|es)>/<action:(!index)>/*' => 'site/<action>',     
      '<lang:(de|it|en|fr|es)>/<controller:\w+>/<id:\d+>' => '<controller>/view', 
      '<lang:(de|it|en|fr|es)>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', 
      '<lang:(de|it|en|fr|es)>/<controller:\w+>/<action:\w+>/*' => '<controller>/<action>', 


     ), 
    ),  

И мой .htaccess такое же, как юй по умолчанию .htaccess

<Files .htaccess> 
    order allow,deny 
    deny from all 
</Files> 
Options All -Indexes 

Я никогда ничего не изменилось.

Теперь я пробовал разные правила для urlManager и пытался добавить другие правила в htacces без успеха.

Моя проблема заключается в том, что некоторые из страниц разбиваются на ошибку 404, то же самое для таких ресурсов, как изображение или сценарий. Если я проверяю запрашиваемый ресурс url от инспектора элемента, я вижу, что запрошенный url переписывается как для URL-адреса сайта (это правильное поведение?) Я также попытался поместить весь проект под корневую подпапку, чтобы создать тестовую среду, отличную от производства, результат хуже, из-за подпапки. Кроме того, если я нажимаю на ссылку на главную страницу, система перенаправляет меня на www.mysite.com/lang/en

Кроме того, я добавил поведение, которое извлекает язык на основе ip или статически статично, поэтому на конец обработки запроса, у меня всегда есть код языка для ввода в качестве параметра get.

(Параметр языка URL GET называется "языки")

Что мне нужно, это:

  • если кто-то посетить главный URL - www.mysite.com - мне нужно, чтобы добавить язык в URL-адресе, поэтому у меня может быть другой URL-адрес на основе языка таким образом: www.mysite.com/it/, www.mysite.com/en/ и т. д.

  • так же, как указано выше для URL-адреса, создайте как это Yii :: app() -> createUrl ('')

  • если кто-то посетить www.mysite.com/index.php?r=site/index же, как и выше, и удалить index.php

  • индекс удаления.PHP и сайт во всей ситуации

  • любого типа URL всегда заканчивается символом/(также, чтобы избежать дублирования контента, для этого я добавил «urlSuffix» => «/»)

  • для других контроллеру мне нужно удалить действие просмотра (но при этом другое) - и когда присутствует «id» как часть URL-адреса таким образом:

    [www.mysite.com/controller/action/id/1?here -другие-get-params] ИЛИ

    [www.mysite.com/controller/id/1?other-params] -> когда действие является видом

Пожалуйста, можете ли вы предоставить пошаговую процедуру того, что я должен делать? Спасибо

С уважением, Франческо

ответ

1

Вы пытались добавить слэш в index.php в .htaccess и вы установите RewriteBase?

С XAMPP на Windows 8 с Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7 должно работать:

.htaccess

RewriteEngine on 
#LOCAL 
RewriteBase /myDir/subDir/ 

# if a directory or a file exists, use it directly 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteCond %{REQUEST_URI} !=/favicon.ico 
# otherwise forward it to index.php 
RewriteRule . /index.php 

AddDefaultCharset utf-8 

И в конфигурации/main.php

'urlManager' => array(
      'class' => 'application.components.UrlManager', // which refers to UrlManager.php 
      'urlFormat' => 'path', 
      'showScriptName' => false, 
      'rules' => array(
       'login' => 'site/login', 
       '<language:(de|en|fr|es)>/' => 'content/index', 
       '<language:(de|en|fr|es)>/<action:(contact|login|logout)>/*' => 'site/<action>', 
       '<language:(de|en|fr|es)>/<controller:\w+>/<id:\d+>' => '<controller>/view', 
       '<language:(de|en|fr|es)>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', 
       '<language:(de|en|fr|es)>/<controller:\w+>/<action:\w+>/*' => '<controller>/<action>', 
       '<language:(de|en|fr|es)>/<module:\w+>/<controller:\w+>/<action:\w+>/*' => '<module>/<controller>/<action>', 
      ), 
     ), 

и /protected/components/UrlManager.php

<?php 
class UrlManager extends CUrlManager 
{ 
    public function createUrl($route,$params=array(),$ampersand='&') 
    { 
     if (!isset($params['language'])) { 
      if (Yii::app()->user->hasState('language')) 
       Yii::app()->language = Yii::app()->user->getState('language'); 
      else if(isset(Yii::app()->request->cookies['language'])) 
       Yii::app()->language = Yii::app()->request->cookies['language']->value; 
      $params['language']=Yii::app()->language; 
     } 
     return parent::createUrl($route, $params, $ampersand); 
    } 
} 

и в httpd.conf

<Directory "C:/Users/someuser/htdocs"> 
Options Indexes FollowSymLinks MultiViews Includes ExecCGI 
AllowOverride All 
Order Allow,Deny 
Allow from all 
Require all granted 
</Directory> 
+0

Привет и спасибо за ваш ответ, но с вашим правилом, я не достиг своей цели. В зависимости от маршрута сайт/индекс был преобразован в www.mysite.com/lang/en (я не хочу lang) и приводит к ошибке 404, контроллер lang не был найден, но lang является параметром, а не контроллером – user2548436