Включить чистые URL-адреса в коде с Yii2



Как я могу включить чистые URL-адреса в Yii2. Я хочу удалить индекс.php и '? из параметров URL. Какой раздел должен быть отредактирован в Yii2 для этого?

849   11  

11 ответов:

я получил его работу в yii2. Включить mod_rewrite на Apache. Ибо basic template выполните следующие действия: Создать .htaccess файл в веб-папке и добавить это

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

затем в папку config, в интернете.php добавить в компоненты

'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>',
    ),
],

в случае advanced template создать .htaccess файлы внутри backend/web и frontend/web папки и добавить urlManager компонент внутри common/config/main.php

первый важный момент заключается в том, что

Module_Rewrite включен на вашем сервере (LAMP,WAMP,XAMP..так далее) Для перемотки URL-адреса в Yii2 framework создайте его .htaccess файл и положить в папку 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

второй шаг

папку config common/config/main-local.php добавить в массив компонентов

'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>',
   ),
],

для меня проблема была:

  1. отсутствует .htaccess в веб-папке так же, как указано выше.
  2. директива AllowOverride была установлена в None, что отключило перезапись URL. Я изменил его на все, и теперь довольно URL-адреса работают хорошо.
<Directory "/path/to/the/web/directory/">
  Options Indexes 
  FollowSymLinks MultiViews 
  AllowOverride All 
  Require all granted
</Directory>

во-первых, создать .htaccess в корневой папке вашего проекта Yii2 со следующим содержимым:

Options +Indexes

<IfModule mod_rewrite.c> 
  RewriteEngine on

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

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

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

создать еще один .htaccess файл в ваших веб-папках со следующим содержимым:

frontend/web/ добавить backend/web/ Не забудьте добавить .htaccess файл как веб-папки:

RewriteEngine on

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

RewriteRule . index.php

теперь это сделано. Изменение конфигурации URL-адрес в коде с 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;

Ваш URL-адрес будет меняться к:

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

вы можете получить доступ к админке через

localhost/yii2project/backend/web

на nginx настроить так

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

просто чтобы добавить к этому обсуждению - я только что установил Yii2, и он включает в себя следующий закомментированный код в config/web.php:

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

Если вы добавляете .файл htaccess в принятом ответе, а затем просто раскомментируйте выше, довольно URL-адреса будут работать (я понятия не имею, для чего нужны "правила" в принятом ответе, но все, кажется, работает без них).

Шаг 1: поставить .htaccess файл в корне.

Options –Indexes

<IfModule mod_rewrite.c> 
  RewriteEngine on

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

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

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

Шаг 2: поставить на 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

Шаг 3: затем в frontend/config/main.php. Следующий код должен быть добавлен внутри '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',
  ),
],

выше шаги работают для меня.

пошаговую инструкцию

Шаг 1

в корне проекта добавьте a .htaccess со следующим содержимым:

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

Шаг 2

в папке /web добавить a .htaccess файл со следующим содержимым:

RewriteEngine On RewriteBase /

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

RewriteRule . index.php

Шаг 3

в файле / config / web.php в элементных компонентах массива добавляет следующий код:

'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>',
    ],
],

сделано..

что сработало для меня -
создать .htaccess в корневой папке моего проекта Yii2, и добавил следующее -

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

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

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

создал новый .htaccess файл веб-папки со следующим содержанием:

frontend/web/

и добавил следующее -

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

затем добавлен urlmanager здесь -

projectFolder/common/config/main.php

для меня это не было, поэтому добавил Это-

'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>',

    ],*/
],

убедитесь, что этот код должен быть в 'components' => [].

перезагрузить сервер и все работать отлично.

Шаг 1: в конфигурации проекта/main.php например: frontend / config / main.php

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

Шаг 2: создать .htaccess файл вставка веб-папки, например: 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

Я не знаю, почему вы, ребята, просто не заходите в папку поставщика yii2 и не устанавливаете public $enablePrettyUrl = true;" (вместе с изменением htaccess, конечно). Это отлично сработало для меня, и это намного проще. И у меня один файл htaccess-в корне проекта, а не в 3 разных местах. Плюс, когда я сделал то, что вы, ребята, предложили для 'config/main.php ' программы в Advanced Yii2, это не сработало. Я получил 404s из Ин-Ян. Я вынул его, и prettyUrls снова работал нормально. Может Быть, Я не следует делать это таким образом из-за обновления композитора, но есть так много "фиктивных" решений для этого, что я устал от этого.

Comments

    Ничего не найдено.