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!
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.
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 locallocalhost/project_name/admin
,localhost/project_name
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.
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
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
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
- pas de règles de réécriture tordues que presque personne ne comprend.
- 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.
- vous pouvez adapter le projet à n'importe quelle structure requise par l'hébergement.
- 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
- 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.