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!
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.
Essayez ceci avec .htaccess Method-
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.
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();
}
}
}
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 locallocalhost/project_name/admin
, localhost/project_name
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.
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
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
open_basedir
restreints sans aucun contrôle, vous ne pourrez peut-être pas l'utiliser.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