it-swarm.com.de

Yii2 htaccess - So verbergen Sie Frontend/Web und Backend/Web VOLLSTÄNDIG

Ich glaube, ich bin ziemlich nahe dran. Ich habe den Zugriff auf die Website (Frontend/Web) und den Pfad /admin (backend/web). Die Site erscheint gut, das Laden von CSS-Dateien usw.

Wenn Sie zu: http: // localhost/yii2app/ wechseln, wird die Startseite geladen und in der Adressleiste nicht weitergeleitet, aber die Seite zeigt in allen URLs Frontend/Web.

wenn Sie Folgendes aufrufen: http: // localhost/yii2app/admin - lädt die Backend-Anmeldeseite, leitet jedoch sofort zu/backend/web/site/login in der Adressleiste (hässlich) um.

Problem: Die frontend/backend-Pfade werden in den URLs (Adressleiste und Links auf der Seite) angezeigt.

Was ich brauche: Ich möchte, dass die gesamte Site funktioniert, ohne Frontend-/Backend-Links anzuzeigen. Die Wurzel des Projekts sollte (unsichtbar) aus dem frontend/web ziehen, ohne es anzuzeigen. Also wird http: // localhost/yii2app/ mein gesamtes Frontend ausgeführt und http: // localhost/yii2app/admin/ mein ganzes Backend.

Warum? Ich denke, dass dieses Setup ziemlich solide und elegant wäre, wenn es sich um einen Server handelt. Ich möchte in der Lage sein, meinen Projektordner live auf eine Site zu verschieben, und es funktioniert einwandfrei, ohne dass Hacks für den lokalen Server benötigt werden.

.htaccess-Datei im /yii2app-Verzeichnis:

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>

Jetzt in den Frontend- und Backend-Webverzeichnissen haben beide den gleichen .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

Ich möchte /frontend/web oder /backend/web niemals sehen :)

Ich habe versucht, mit der RewriteRule im htaccess der Root zu spielen, um /admin zur URL hinzuzufügen, aber es hat mir immer gesagt, dass /admin nicht existiert. Ich KNOW es existiert nicht und ich möchte nicht, dass es existiert. Ich möchte, dass es sich um einen relativen Pfad handelt. Beispiel:/admin ==/backend/web.

Anders formuliert Ich weise alles in der Projektwurzel ( http: // localhost/yii2app/ ) auf, frontend/web zu laden, ohne es jedoch anzuzeigen. Http: // localhost/yii2app/admin , um backend/web zu laden und einfach http: // localhost/yii2app/admin anzuzeigen. Offensichtlich würden sie ihren jeweiligen controller/action anhängen. So könnte der Admin aussehen wie http: // localhost/yii2app/admin/site/login

HINWEIS: Ich habe mit keiner der Dateien gespielt. Dies ist ein fortgeschrittenes Setup von yii2, das Composer verwendet und den Dokumenten folgt. Das einzige, was ich bisher gespielt habe, sind die erwähnten Htaccess-Dateien.

Vielen Dank!

28
Wade

Wenn Ihr einziges Ziel darin besteht, /frontend/web oder /backend/web auch ohne die Verwendung von .htaccess-Regeln nicht zu sehen, können Sie Folgendes tun:

Warum nicht einfach den Inhalt der web-Ordner herausziehen und im Stammverzeichnis ablegen? Passen Sie einfach den Pfad an, der auf die Framework- und Konfigurationsdateien in den Eingabeskripten index.php verweist.

Ihre Verzeichnisstruktur würde folgendermaßen aussehen:

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

Ihr yii2app/index.php würde dann so aussehen:

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

und dein yii2app/admin/index.php würde so aussehen:

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

BEARBEITEN: Ihre Einstiegsskripte können anders aussehen als meine, aber Sie sollten die Idee bekommen, die Pfade zu ändern, um die Framework-Dateien anhand dieser Beispiele zu finden.

25
deacs

Versuchen Sie dies mit .htaccess Method- 

Schritt 1  

Erstellen Sie die .htaccess-Datei im Stammverzeichnis, d. H. advanced/.htaccess, und geben Sie den folgenden Code ein.

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

Hinweis : Wenn Sie einen lokalen Server verwenden, ersetzen Sie ^/ durch ^/project_name/, wo das Pfeilzeichen angezeigt wird. Entfernen Sie diese Pfeilzeichen <------, nachdem das Setup abgeschlossen ist.

Schritt 2  

Erstellen Sie nun eine components/Request.php-Datei im allgemeinen Verzeichnis und geben Sie den folgenden Code in diese Datei ein.

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

Schritt 3  

Komponente installieren. Schreiben Sie den folgenden Code in frontend/config/main.php- bzw. backend/config/main.php-Dateien.

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

Schritt 4 (optional, wenn bis Schritt 3 nicht funktioniert)  

.htaccess-Datei im Webverzeichnis erstellen

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

Hinweis: Stellen Sie sicher, dass Sie die Mod-Umschreibung in Apache aktiviert haben

Das ist es! Sie können Ihr Projekt mit versuchen 
www.project.com/admin, www.project.com

im lokalen Server
localhost/project_name/admin, localhost/project_name

28
mohit

Wie @deacs sagte, verschieben Sie einfach die Dateien vom Frontend/web nach yii2app (Stammordner) und erstellen Sie einen Ordner in yii2app "admin" und verschieben Sie die Dateien vom Backend/web nach yii2app/admin und erstellen Sie dann .htaccess-Dateien sowohl in admin als auch in yii2app mit folgenden Code:

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

Fügen Sie dann die urlManager-Komponente in der Konfigurationsdatei main.php in frontend/config/main.php und backend/config/main.php hinzu und ändern Sie sie mit folgendem Code:

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

Dann ändern Sie die index.php in yii2app mit folgendem 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__ . '/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();

Ändern Sie auch die index.php in yii2app/admin mit folgendem 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();

Das ist alles, was Sie brauchen, um die SEO-freundlichen URLs in yii2 zu vervollständigen ... Ich hatte Schwierigkeiten, dann bekam ich Hilfe von @deacs answer und ich denke, das hilft vielleicht jemandem.

3
shivgre

Nach 2 Tagen der Suche nach den besten Lösungen schaffe ich es auf diese Weise (Host bei Shared Hosting) . Ich erstelle die Subdomain admin.xxxxx.com und verweise auf das Dokument root /public_html/xxxxxx/backend/web.
Da Shared Hosting Ihnen nicht erlaubt, ein benutzerdefiniertes Dokument als Stammdomäne für Ihre Hauptdomäne festzulegen, verwende ich diese Lösung: 

Ändern Sie den primären Domänennamen in Ihrem Konto und fügen Sie die alte primäre Domäne als Addon-Domäne hinzu. Auf diese Weise können Sie den Stammordner für die primäre Domäne/neue Addon-Domäne auswählen. (Die neue primäre Domäne verweist jetzt auf public_html.)

Dann zeigen Sie (jetzt meine Addon-Domäne) auf den rechten Dokumentstamm für das Frontend /public_html/xxxxxx/frontend/web

1
despotbg

Die bisher einfachste und flexibelste Lösung für mich sind symlinks . Sie können das Projekt überall platzieren und nur Symlinks zu Verzeichnissen erstellen, die von Ihrem Hosting erzwungen werden. Legen Sie das Projekt beispielsweise in ~/domains/example.com/project ab und erstellen Sie symbolische Links zum public_html-Verzeichnis.

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

Und dort haben Sie http://example.com/ mit Frontend und http://example.com/admin/ mit Backend.

Wenn Sie ein Backend in einer separaten Domain benötigen (admin.example.com):

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

Pros

  1. Keine verdrehten Regeln zum Umschreiben, die fast niemand versteht.
  2. Sie haben nicht das gesamte Projekt im öffentlichen Verzeichnis, daher werden einige falsche Konfigurationen von Webserver und/oder PHP Ihren Code und die Konfigurationsdateien nicht öffentlich machen.
  3. Sie können das Projekt an jede vom Hosting benötigte Struktur anpassen. 
  4. Wenn Sie relative Symlinks verwenden, können Sie sie unter Versionskontrolle halten und mit allen Apps eine einzige Webroot als Unterverzeichnisse erstellen.

Cons

  1. Wenn Sie ein Hosting mit einigen eingeschränkten open_basedir-Einstellungen ohne Kontrolle darüber haben, können Sie es möglicherweise nicht verwenden.
0
rob006

Ich folgte der "Deacs" -Antwort und erhielt einen Fehler

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

dann habe ich den "assets" -Ordner in "yii2app" erstellt und es funktioniert

---------- Zweite Methode ------------------------

Ohne die Dateien zu verschieben, können Sie dem folgenden Link folgen

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

---------- Dritte Methode ---------------------------

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

0
Aamir Sarwar