web-dev-qa-db-fra.com

Yii2 htaccess - Comment masquer COMPLÈTEMENT frontend/web et backend/web

Je pense que je suis assez proche. J'ai le htaccess qui redirige vers le site web (frontend/web) et le chemin /admin (backend/web). Le site semble bien, le chargement des fichiers CSS, etc.

Si vous allez sur: http: // localhost/yii2app/ - il charge la page d'accueil et ne redirige pas dans la barre d'adresse, mais la page affiche frontend/web dans toutes les URL.

si vous allez à: http: // localhost/yii2app/admin - il charge la page de connexion du backend, mais il redirige immédiatement vers/backend/web/site/login dans la barre d'adresse (moche).

Problème: Les chemins frontend/backend s'affichent dans les URL (barre d'adresse et liens sur la page).

Ce dont j'ai besoin: Je veux que tout le site fonctionne sans montrer de liens frontend/backend. La racine du projet doit extraire (invisible) du frontend/web sans l'afficher .. So http: // localhost/yii2app/ exécute tout mon interface et http: // localhost/yii2app/admin/ / tout mon backend.

Pourquoi? Je pense que cette configuration serait plutôt solide et élégante en live sur un serveur. Je veux être capable de pousser mon dossier de projet en direct sur un site et cela fonctionne très bien sans avoir à avoir des bidouilles pour gérer local vs serveur.

.htaccess fichier dans /yii2app dir:

Options -Indexes
RewriteEngine on

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_URI} !^/backend/web/(assets|css)/
    RewriteCond %{REQUEST_URI} admin
    RewriteRule .* backend/web/index.php [L]

    RewriteCond %{REQUEST_URI} !^/(frontend|backend)/web/(assets|css)/
    RewriteCond %{REQUEST_URI} !admin
    RewriteRule .* frontend/web/index.php [L]
</IfModule>

Désormais, dans les répertoires web frontend et backend, ils ont tous les deux le même .htaccess:

RewriteEngine on

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

# otherwise forward the request to index.php
RewriteRule . index.php

Je ne veux pas voir /frontend/web ou /backend/web jamais :)

J'ai essayé de jouer avec RewriteRule dans le htaccess de la racine pour ajouter /admin à l'URL, mais cela ne cessait de me dire que /admin n'existait pas. Je SAIS qu'il n'existe pas et je ne veux pas qu'il existe. Je veux que ce soit un chemin relatif .. c'est-à-dire:/admin ==/backend/web.

Formulé d'une autre manière. Je fais tout dans la racine du projet ( http: // localhost/yii2app/ ) pour charger frontend/web, mais sans le montrer. En outre, http: // localhost/yii2app/admin pour charger backend/web et afficher simplement http: // localhost/yii2app/admin . Évidemment, ils auraient leur controller/action respectif attaché à eux. Donc, admin pourrait ressembler à http: // localhost/yii2app/admin/site/login

NOTE: Je n'ai joué avec aucun des fichiers. Il s’agit d’une configuration d’acquisition avancée yii2, utilisant composeur et respectant la documentation. La seule chose avec laquelle j'ai joué jusqu'à présent sont les fichiers htaccess mentionnés.

Je vous remercie!

28
Wade

Si votre seul objectif est de ne jamais voir /frontend/web ou /backend/web, même sans utiliser les règles .htaccess, vous pouvez choisir:

Pourquoi ne pas simplement extraire le contenu des dossiers web et les placer à la racine? Ajustez simplement le chemin en référence aux fichiers framework et config dans les scripts de saisie index.php.

Votre structure dir ressemblerait à ceci:

- yii2app/
    - frontend/
    - backend/
    - common/
    - .. other folders..
    - admin/
        - assets/
        - css/
        - index.php
    - assets/
    - css/
    - index.php

Votre yii2app/index.php ressemblerait alors à ceci:

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/common/config/bootstrap.php');
require(__DIR__ . '/frontend/config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/common/config/main.php'),
    require(__DIR__ . '/common/config/main-local.php'),
    require(__DIR__ . '/frontend/config/main.php'),
    require(__DIR__ . '/frontend/config/main-local.php')
);

$application = new yii\web\Application($config);
$application->run();

et votre yii2app/admin/index.php ressemblerait à:

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../common/config/bootstrap.php');
require(__DIR__ . '/../backend/config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../common/config/main.php'),
    require(__DIR__ . '/../common/config/main-local.php'),
    require(__DIR__ . '/../backend/config/main.php'),
    require(__DIR__ . '/../backend/config/main-local.php')
);

$application = new yii\web\Application($config);
$application->run();

EDIT: vos scripts d’entrée pourraient sembler différents des miens, mais vous devriez avoir l’idée de changer les chemins pour trouver les fichiers de structure avec ces exemples.

25
deacs

Essayez ceci avec .htaccess Method- 

Étape 1  

Créez un fichier .htaccess dans le dossier racine, i.e advanced/.htaccess et écrivez ci-dessous le code.

Options +FollowSymlinks
RewriteEngine On

# deal with admin first
RewriteCond %{REQUEST_URI} ^/(admin) <------
RewriteRule ^admin/assets/(.*)$ backend/web/assets/$1 [L]
RewriteRule ^admin/css/(.*)$ backend/web/css/$1 [L]

RewriteCond %{REQUEST_URI} !^/backend/web/(assets|css)/  <------
RewriteCond %{REQUEST_URI} ^/(admin)  <------
RewriteRule ^.*$ backend/web/index.php [L]


RewriteCond %{REQUEST_URI} ^/(assets|css)  <------
RewriteRule ^assets/(.*)$ frontend/web/assets/$1 [L]
RewriteRule ^css/(.*)$ frontend/web/css/$1 [L]
RewriteRule ^js/(.*)$ frontend/web/js/$1 [L] 
RewriteRule ^images/(.*)$ frontend/web/images/$1 [L]

RewriteCond %{REQUEST_URI} !^/(frontend|backend)/web/(assets|css)/  <------
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ frontend/web/index.php

Note : si vous essayez sur le serveur local, remplacez ^/ par ^/project_name/ où vous voyez un signe de flèche Supprimez ces flèches <------ une fois l’installation terminée.

Étape 2  

Créez maintenant un fichier components/Request.php dans le répertoire commun et écrivez le code ci-dessous dans ce fichier.

namespace common\components;


class Request extends \yii\web\Request {
    public $web;
    public $adminUrl;

    public function getBaseUrl(){
        return str_replace($this->web, "", parent::getBaseUrl()) . $this->adminUrl;
    }


    /*
        If you don't have this function, the admin site will 404 if you leave off 
        the trailing slash.

        E.g.:

        Wouldn't work:
        site.com/admin

        Would work:
        site.com/admin/

        Using this function, both will work.
    */
    public function resolvePathInfo(){
        if($this->getUrl() === $this->adminUrl){
            return "";
        }else{
            return parent::resolvePathInfo();
        }
    }
}

Étape 3  

Installation du composant. Ecrivez ci-dessous le code dans les fichiers frontend/config/main.php et backend/config/main.php respectivement.

//frontend, under components array
'request'=>[
    'class' => 'common\components\Request',
    'web'=> '/frontend/web'
],
'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
],

// backend, under components array
'request'=>[
    'class' => 'common\components\Request',
    'web'=> '/backend/web',
    'adminUrl' => '/admin'
],
'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
],

Étape 4 (Facultatif, si ne fonctionne pas jusqu'à la troisième étape)  

créer un fichier .htaccess dans un répertoire web

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php?/$1 [L]

Remarque: assurez-vous que vous avez activé votre réécriture de mod dans Apache.

C'est tout! Vous pouvez essayer votre projet avec 
www.project.com/admin, www.project.com

dans le serveur local
localhost/project_name/admin, localhost/project_name

28
mohit

Comme @deacs, il suffit de déplacer les fichiers de frontend/web vers yii2app (dossier racine) et de créer un dossier dans yii2app "admin" et de déplacer les fichiers de backend/web vers yii2app/admin, puis de créer des fichiers .htaccess dans les deux fichiers admin et yii2app. code suivant:

Options +FollowSymLinks
IndexIgnore */*

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

Ensuite, ajoutez/modifiez le composant urlManager dans le fichier de configuration main.php dans frontend/config/main.php et backend/config/main.php avec le code suivant:

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

Puis changez le fichier index.php dans yii2app avec le code suivant:

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/common/config/bootstrap.php');
require(__DIR__ . '/frontend/config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/common/config/main.php'),
    require(__DIR__ . '/common/config/main-local.php'),
    require(__DIR__ . '/frontend/config/main.php'),
    require(__DIR__ . '/frontend/config/main-local.php')
);

$application = new yii\web\Application($config);
$application->run();

Changez également le fichier index.php dans yii2app/admin avec le code suivant:

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../common/config/bootstrap.php');
require(__DIR__ . '/../backend/config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../common/config/main.php'),
    require(__DIR__ . '/../common/config/main-local.php'),
    require(__DIR__ . '/../backend/config/main.php'),
    require(__DIR__ . '/../backend/config/main-local.php')
);

$application = new yii\web\Application($config);
$application->run();

C’est tout ce dont vous avez besoin pour compléter les URL conviviales pour le référencement dans yii2 . Je me débattais moi-même et puis j’ai reçu l’aide de @deacs et je pensais que cela aiderait peut-être quelqu'un.

3
shivgre

Après 2 jours à la recherche des meilleures solutions, je le fais de cette façon (hôte sur hébergement mutualisé) . Je crée le sous-domaine admin.xxxxx.com et le pointe vers le document racine /public_html/xxxxxx/backend/web
Parce que l'hébergement partagé ne vous permet pas de mettre la racine de document personnalisée pour votre domaine principal, j'utilise cette solution: 

Modifiez le nom de domaine principal de votre compte, puis ajoutez l’ancien domaine principal en tant que domaine complémentaire. De cette façon, vous pouvez choisir le dossier racine de votre choix pour le domaine principal/nouveau domaine addon. (Le nouveau domaine principal va maintenant pointer sur public_html.)

Puis pointez (maintenant mon domaine addon) vers la racine de document droite pour le frontend /public_html/xxxxxx/frontend/web

1
despotbg

Jusqu'à présent, la solution la plus facile et la plus flexible pour moi est les liens symboliques . Vous pouvez placer un projet n'importe où et ne créer que des liens symboliques vers des répertoires contraints par votre hébergement. Par exemple, placez le projet dans ~/domains/example.com/project et créez des liens symboliques vers le répertoire public_html.

cd ~/domains/example.com
# remove old public_html directory
mv public_html old_public_html
# create symlink for fronted
ln -s ./project/frontend/web public_html
# create symlink for backend in /admin subdirectory
ln -s ./project/backend/web public_html/admin

Et là, vous avez http://example.com/ avec frontend et http://example.com/admin/ avec backend.

Si vous avez besoin d'un serveur dans un domaine séparé (admin.example.com):

ln -s ~/domains/example.com/project/backend/web ~/domains/admin.example.com/public_html

Avantages

  1. Aucune règle de réécriture tordue que presque personne ne comprend.
  2. Vous n'avez pas tout le projet dans le répertoire public, donc une mauvaise configuration du serveur web et/ou PHP ne rendra pas public votre code et vos fichiers de configuration.
  3. Vous pouvez adapter le projet à toute structure requise par hébergement. 
  4. Si vous utilisez des liens symboliques relatifs, vous pouvez le conserver sous contrôle de version et créer une seule racine Web avec toutes les applications en tant que sous-répertoires.

Les inconvénients

  1. Si vous avez un hébergement avec certains paramètres open_basedir restreints sans aucun contrôle, vous ne pourrez peut-être pas l'utiliser.
0
rob006

J'ai suivi la réponse "deacs" et j'ai eu l'erreur suivante

Invalid Configuration – yii\base\InvalidConfigException
The directory does not exist: D:/wamp/www/yii2app/assets

puis j'ai créé le dossier "assets" dans "yii2app" et cela fonctionne

---------- Deuxième méthode ------------------------

Sans déplacer les fichiers, vous pouvez suivre le lien suivant

https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/start-installation.md

---------- Troisième méthode -----------------------------

http://www.yiiframework.com/doc-2.0/guide-tutorial-shared-hosting.html

0
Aamir Sarwar