Yiii2 htaccess - comment cacher frontend/web et backend / web complètement

je pense que je suis assez proche. J'ai la redirection htaccess vers le site web (frontend / web) et le /admin chemin d'accès (backend/web). Le site apparaît très bien, le chargement des fichiers CSS, etc.

Si vous allez à: 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 URLs.

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

Problème:frontend/backend les chemins sont affichés dans les URLs (barre d'adresse, et liens sur la page).

ce dont j'ai besoin: je veux que l'ensemble du site fonctionne sans afficher les liens frontend/backend. La racine du projet devrait tirer (invisiblement) de frontend/web sans la montrer.. Donc http://localhost/yii2app/ dirige tout mon front, et http://localhost/yii2app/admin/ dirige tout mon arrière-plan.

Pourquoi? Je sens que cette installation serait assez solide et élégant où vivent 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 hacks pour gérer le serveur vs local.

.htaccess fichier /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>

maintenant dans les répertoires web frontend et backend, ils ont tous les deux les mêmes .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 veulent pas voir /frontend/web ou /backend/web jamais :)

j'ai essayé de jouer avec la règle RewriteRule dans le htaccess de la racine pour ajouter /admin à L'URL, mais il n'arrêtait pas de me dire /admin n'existe pas. J' il n'existe pas, et je ne veux pas qu'elle existe. Je veux qu'il soit un chemin relatif.. c'est à dire: /admin == /backend/web.

formulé d'une autre façon. Je voie tout dans la racine du projet (http://localhost/yii2app/) pour charger frontend/web, mais sans le montrer. Aussi,http://localhost/yii2app/admin charger backend/web et il suffit de montrer http://localhost/yii2app/admin. Évidemment, ils ont leurs propres controller/action attaché à eux. Donc admin pourrait ressembler à http://localhost/yii2app/admin/site/login

NOTE: je n'ai pas joué avec les fichiers. Il s'agit d'un stock yiii2 configuration avancée, en utilisant composer, et en suivant les docs. La seule chose que j'ai joué jusqu'à présent sont les htaccess mentionné.

Merci!

25
demandé sur SohelAhmedM 2015-01-24 00:02:35

6 réponses

si votre seul but est d'atteindre jamais voir /frontend/web ou /backend/web, même sans aide .les règles htaccess, vous pourrait aller pour le code suivant:

pourquoi ne pas simplement extraire le contenu du web dossiers et de les placer dans la racine? Il suffit d'ajuster le chemin faisant référence au framework et aux fichiers de configuration dans les scripts d'entrée index.php.

votre structure dir ressemblerait à:

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

yii2app/index.php ressemblerait alors à:

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 ressemble à:

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 peuvent sembler différents des miens, mais vous devriez avoir l'idée de changer les chemins pour trouver les fichiers framework avec ces exemples.

22
répondu deacs 2015-01-23 22:06:37

Essayez-le avec les .htaccess de la Méthode

Etape 1

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

Options +FollowSymlinks
RewriteEngine On

# deal with admin first
RewriteCond %{REQUEST_URI} ^/(admin) <------
RewriteRule ^admin/assets/(.*)$ backend/web/assets/ [L]
RewriteRule ^admin/css/(.*)$ backend/web/css/ [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/ [L]
RewriteRule ^css/(.*)$ frontend/web/css/ [L]
RewriteRule ^js/(.*)$ frontend/web/js/ [L] 
RewriteRule ^images/(.*)$ frontend/web/images/ [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

Remarque:: si vous essayez le serveur local, remplacez ^/^/project_name/ où vous voyez le signe de flèche. Supprimer ces signe flèche <------ une fois la configuration terminée.

Etape 2

Maintenant créer un components/Request.php fichier dans le répertoire commun et écrire 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();
        }
    }
}

Etape 3

installation du composant. Ecrire le code ci-dessous en frontend/config/main.php et backend/config/main.php fichiers 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'à l'étape trois)

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

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

Note: assurez-vous d'avoir activé votre mod rewrite dans apache

c'est elle! Vous pouvez essayer votre projet avec

www.project.com/admin,www.project.com

dans le serveur local

localhost/project_name/admin,localhost/project_name

24
répondu mohit 2017-06-22 11:42:48

comme @deacs dit juste déplacer les fichiers de frontend / web à yii2app (dossier racine) et créer un dossier dans yii2app "admin" et déplacer des fichiers de backend/web à yii2app/admin puis créer .htaccess dans les deux admin et yii2app avec le 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

puis Ajouter / modifier le composant urlManager dans le fichier de configuration main.php dans les deux frontend/config/main.php et backend/config / main.php avec le code suivant :

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

alors changez l'index.php en 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();

modifiez aussi l'indice.php in yi2app / admin with following code:

<?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();

Thats tout ce dont vous avez besoin pour compléter les URLs SEO friendly dans yii2. J'étais moi-même en difficulté et puis j'ai eu l'aide de @deacs réponse et je pensais que peut-être cela aidera quelqu'un.

3
répondu shivgre 2016-03-23 09:55:48

après 2 jours de recherche des meilleures solutions, je le fais de cette façon (hôte sur l'hébergement partagé). Je fais un sous-domaine admin.xxxxx.com et qu'il pointe vers la racine du document /public_html/xxxxxx/backend/web

Parce que l'hébergement partagé ne vous permet pas de mettre custom document root pour votre domaine principal, j'utilise cette solution :

changez le nom de domaine primaire sur votre compte, puis ajoutez l'ancien domaine primaire en tant que domaine addon. De cette façon, vous pouvez choisir le dossier racine que vous voulez pour le domaine principal/nouvel addon domaine. (Le nouveau domaine primaire pointera maintenant vers public_html.)

puis pointer (maintenant mon domaine addon) vers la racine droite du document pour frontend /public_html/xxxxxx/frontend/web

1
répondu despotbg 2016-01-09 13:17:12

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 ça marche

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

Sans déplacer les fichiers, vous pouvez suivre 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
répondu Aamir Sarwar 2016-01-11 11:40:44

la solution la plus simple et la plus flexible pour moi est liens symboliques. Vous pouvez placer le projet n'importe où et créer seulement des liens symboliques vers des répertoires forcés par votre hébergement. Par exemple, mettez projet ~/domains/example.com/project et créer des liens symboliques vers public_html répertoire.

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 l'avez http://example.com/ avec frontend et http://example.com/admin/ avec backend.

si vous avez besoin de backend dans un domaine séparé (admin.example.com):

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

Pros

  1. pas de règles de réécriture tordues 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 de PHP ne rendra pas public votre code et les fichiers de configuration.
  3. vous pouvez adapter le projet à n'importe quelle structure requise par l'hébergement.
  4. si vous utilisez des liens symboliques relatifs, vous pouvez le garder sous le contrôle de la version et créer webroot unique avec toutes les applications comme les sous-répertoires.

Cons

  1. Si vous avez un hébergement avec certains restreint open_basedir paramètres sans aucun contrôle sur elle, vous pouvez l'impossibilité de faire de l'utiliser.
0
répondu rob006 2018-04-13 23:23:27