web-dev-qa-db-fra.com

Activer l'URL propre dans Yii2

Comment puis-je activer les URLs propres dans Yii2. Je veux supprimer index.php et '?' à partir des paramètres d'url. Quelle section doit être modifiée dans Yii2 pour cela?

58
user7282

Je l'ai obtenu en yii2. Activez mod_rewrite pour Apache. Pour basic template, procédez comme suit: Créez un fichier .htaccess dans un dossier Web et ajoutez-le.

RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php

Puis dans le dossier config, dans web.php, ajoutez aux composants

'urlManager' => [
    'class' => 'yii\web\UrlManager',
    // Disable index.php
    'showScriptName' => false,
    // Disable r= routes
    'enablePrettyUrl' => true,
    'rules' => array(
            '<controller:\w+>/<id:\d+>' => '<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
    ),
],

Dans le cas de advanced template, créez les fichiers .htaccess dans les dossiers backend/web et frontend/web et ajoutez le composant urlManager dans common/config/main.php

146
user7282

Pour moi, le problème était:

  1. Il manque le fichier .htaccess dans le dossier Web, comme mentionné ci-dessus.
  2. La directive AllowOverride a été définie sur Aucune, ce qui a désactivé les réécritures d'URL. Je l'ai changé en Tous et maintenant, les jolies URL fonctionnent bien.
<Directory "/path/to/the/web/directory/">
  Options Indexes 
  FollowSymLinks MultiViews 
  AllowOverride All 
  Require all granted
</Directory>
13
pkout

Le premier point important est que

Module_Rewrite est activé sur votre serveur (LAMP, WAMP, XAMP..etc) Pour le recâblage d'URL dans le framework yii2 Créez un fichier .htaccess et mettez-le dans le dossier/web

RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php

Deuxième étape

Dossier de configuration common/config/main-local.php ajouter au tableau de composants

'urlManager' => [
   'class' => 'yii\web\UrlManager',
   // Disable index.php
   'showScriptName' => false,
   // Disable r= routes
   'enablePrettyUrl' => true,
   'rules' => array(
      '<controller:\w+>/<id:\d+>' => '<controller>/view',
      '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
      '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
   ),
],
13

Commencez par créer un dossier .htaccess dans le dossier racine de votre projet Yii2 avec le contenu suivant:

Options +Indexes

<IfModule mod_rewrite.c> 
  RewriteEngine on

  RewriteCond %{REQUEST_URI} !^public
  RewriteRule ^(.*)$ frontend/web/$1 [L] 
</IfModule>

# Deny accessing below extensions
<Files ~ "(.json|.lock|.git)">
Order allow,deny
Deny from all
</Files>

# Deny accessing dot files
RewriteRule (^\.|/\.) - [F]

Créez un autre fichier .htaccess dans vos dossiers Web avec le contenu suivant:

frontend/web/addbackend/web/ N'oubliez pas d'ajouter le fichier .htaccess aux deux dossiers Web:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule . index.php

Maintenant c'est fait. Changez votre configuration d'URL dans Yii2:

<?php

use \yii\web\Request;
$baseUrl = str_replace('/frontend/web', '', (new Request)->getBaseUrl());


$config = [
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'aiJXeUjj8XjKYIG1gurMMnccRWHvURMq',
            'baseUrl' => $baseUrl,
        ],
         "urlManager" => [
            'baseUrl' => $baseUrl,
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            "rules" => [
                "home" => "site/index",
                "about-us" => "site/about",
                "contact-us" => "site/contact",
            ]
        ]
    ],
];

return $config;

Votre URL deviendra:

localhost/yii2project/site/about => localhost/yii2project/about-uslocalhost/yii2project/site/contact => localhost/yii2project/contact-uslocalhost/yii2project/site/index => localhost/yii2project/home

Vous pouvez accéder à votre administrateur via

localhost/yii2project/backend/web

8
Ilyas karim

Pour ajouter à cette discussion, je viens d’installer Yii2 et il inclut le code commenté suivant dans config/web.php:

'urlManager' => [
  'enablePrettyUrl' => true,
  'showScriptName' => false,
  'rules' => [],
],

Si vous ajoutez le fichier .htaccess à la réponse acceptée, alors décommentez ce qui précède, les jolies URL fonctionneront (je ne sais pas à quoi servent les "règles" de la réponse acceptée, mais tout semble fonctionner sans elles).

2
Vanessa Deagan

sur Nginx configurer comme ça

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}
2
rakhmatov

Étape 1: Mettez le fichier .htaccess à la racine.

Options –Indexes

<IfModule mod_rewrite.c> 
  RewriteEngine on

  RewriteCond %{REQUEST_URI} !^public
  RewriteRule ^(.*)$ frontend/web/$1 [L] 
</IfModule>

# Deny accessing below extensions
<Files ~ "(.json|.lock|.git)">
Order allow,deny
Deny from all
</Files>

# Deny accessing dot files
RewriteRule (^\.|/\.) - [F]

Étape 2: Mettez le fichier .htaccess dans le frontend/web.

RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php

Étape 3: Puis changements dans frontend/config/main.php. Le code suivant doit être ajouté dans 'components' => [].

'request' => [
 'csrfParam' => '_csrf-frontend',
 'baseUrl' => '/yii-advanced', //http://localhost/yii-advanced
],

'urlManager' => [
  'class' => 'yii\web\UrlManager',
  'showScriptName' => false, // Disable index.php
  'enablePrettyUrl' => true, // Disable r= routes
  'rules' => array(
          'about' => 'site/about',
          'service' => 'site/service',
          'contact' => 'site/contact',
          'signup' => 'site/signup',
          'login' => 'site/login',
  ),
],

Les étapes ci-dessus sont travaillées pour moi.

1
Prakash Pazhanisamy

Étape 1: dans le projet config/main.php, par exemple: frontend/config/main.php

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [],
        ]

Étape 2: créer un dossier Web avec un fichier .htaccess, par exemple: frontend/web

RewriteEngine on

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

# otherwise forward it to index.php
RewriteRule . index.php

#php_flag  display_errors        on
#php_value error_reporting       2039
0
jokeblack

Ce qui a fonctionné pour moi
créer un .htaccess au dossier racine de mon projet Yii2, et ajouté après-

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On
</IfModule>

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_URI} ^/.*
    RewriteRule ^(.*)$ web/$1 [L]

    RewriteCond %{REQUEST_URI} !^/web/
    RewriteCond %{REQUEST_FILENAME} !-f [OR]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^.*$ web/index.php
</IfModule>

Création de nouveaux dossiers Web de fichiers .htaccess avec le contenu suivant:

frontend/web/

et ajouté après-

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Puis ajouté urlmanager ici-

projectFolder/common/config/main.php

Pour moi ce n'était pas là, alors a ajouté cet as-

'urlManager' => [
    'class' => 'yii\web\UrlManager',
    'enablePrettyUrl' => true,
    'showScriptName' => false,
   /* 'rules' => [
        '<controller:\w+>/<id:\d+>' => '<controller>/view',
        '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
        '<controller:\w+>/<action:\w+>' => '<controller>/<action>',

    ],*/
],

Assurez-vous que ce code doit être dans 'components' => [].

Redémarrez mon serveur et tout fonctionne bien.

0
S.Yadav

Instruction pas à pas

Étape 1

À la racine du projet, ajoutez un fichier .htaccess avec le contenu suivant:

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine On
     RewriteCond %{REQUEST_URI} !^/(web)
    RewriteRule ^assets/(.*)$ /web/assets/$1 [L]
    RewriteRule ^css/(.*)$ web/css/$1 [L]
    RewriteRule ^js/(.*)$ web/js/$1 [L]
    RewriteRule ^images/(.*)$ web/images/$1 [L]
    RewriteRule (.*) /web/$1
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /web/index.php

Étape 2

Dans le dossier/Web, ajoutez un fichier .htaccess avec le contenu suivant:

RewriteEngine On RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php

Étape 3

Dans le fichier /config/web.php, dans les composants d'élément de array, ajoutez le code suivant:

'request' => [
    // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
    'cookieValidationKey' => 'yYy4YYYX8lYyYyQOl8vOcO6ROo7i8twO',
    'baseUrl' => ''
],

//...

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        '' => 'site/index',                                
        '<controller:\w+>/<action:\w+>/' => '<controller>/<action>',
    ],
],

Terminé..

0
CollinsKe