how framework first descargar application app php apache .htaccess mod-rewrite yii2

php - framework - Yii2 htaccess-Cómo ocultar frontend/web y backend/web COMPLETAMENTE



yii2 first application (6)

Como dijo @deacs, simplemente mueva los archivos de frontend / web a yii2app (carpeta raíz) y cree una carpeta en yii2app "admin" y mueva los archivos de backend / web a yii2app / admin y luego cree archivos .htaccess en admin y yii2app con siguiente código:

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

Luego agregue / modifique el componente urlManager en el archivo de configuración main.php en frontend / config / main.php y backend / config / main.php con el siguiente código:

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

Luego cambie el index.php en yii2app con el siguiente código:

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

También cambie el index.php en yii2app / admin con el siguiente código:

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

Eso es todo lo que necesita para completar las URL amigables de SEO en yii2. Estaba luchando y luego recibí ayuda de @deacs answer y pensé que tal vez esto ayude a alguien.

Creo que estoy bastante cerca. Tengo el htaccess que redirige al sitio web (frontend / web) y la ruta /admin ( backend/web ). El sitio parece estar bien, cargando archivos CSS, etc.

Si va a: http://localhost/yii2app/ : carga la página de inicio y no redirige en la barra de direcciones, pero la página muestra frontend / web en todas las URL.

si va a: http://localhost/yii2app/admin : carga la página de inicio de sesión de back-end, sin embargo, redirige inmediatamente a / backend / web / site / login en la barra de direcciones (feo).

Problema: las rutas frontend/backend se muestran en las URL (barra de direcciones y enlaces en la página).

Lo que necesito: quiero que todo el sitio funcione sin mostrar enlaces frontend / backend. La raíz del proyecto debe extraerse (de manera invisible) de la frontend/web sin mostrarla. Entonces http://localhost/yii2app/ ejecuta toda mi interfaz y http://localhost/yii2app/admin/ ejecuta todo el backend.

¿Por qué? Siento que esta configuración sería bastante sólida y elegante cuando se vive en un servidor. Quiero poder enviar mi carpeta de proyectos en vivo a un sitio y funciona bien sin tener que tener hacks para manejar el servidor local versus el servidor.

Archivo .htaccess en /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>

Ahora en los directorios web frontend y backend, ambos tienen el mismo .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

No quiero ver /frontend/web o /backend/web nunca :)

Intenté jugar con RewriteRule en el acceso hta de la raíz para agregar /admin a la URL, pero seguía diciéndome que /admin no existe. Sé que no existe, y no quiero que exista. Quiero que sea una ruta relativa ... es decir: / admin == / backend / web.

Dicho de otra manera. http://localhost/yii2app/ todo en la raíz del proyecto ( http://localhost/yii2app/ ) para cargar frontend/web , pero sin mostrarlo. Además, http://localhost/yii2app/admin para cargar backend/web y solo muestra http://localhost/yii2app/admin . Obviamente tendrían su respectivo controller/action adjunto a ellos. Entonces el administrador podría verse como http://localhost/yii2app/admin/site/login

NOTA: no he jugado con ninguno de los archivos. Esta es una configuración avanzada de stock yii2, usando composer y siguiendo los documentos. Lo único con lo que he jugado hasta ahora son los archivos htaccess mencionados.

¡Gracias!


Después de 2 días buscando las mejores soluciones, lo hago de esta manera (host en hosting compartido). Hago el subdominio admin.xxxxx.com y lo admin.xxxxx.com para documentar root /public_html/xxxxxx/backend/web
Debido a que el alojamiento compartido no le permite colocar la raíz del documento personalizado para su dominio principal, uso esta solución:

Cambie el nombre de dominio primario en su cuenta, luego agregue el dominio primario anterior como un dominio adicional. De esta manera, puede elegir la carpeta raíz que desee para el dominio principal / nuevo dominio adicional. (El nuevo dominio primario ahora apuntará a public_html).

Luego apunte (ahora mi dominio de complemento) a la raíz del documento derecho para frontend /public_html/xxxxxx/frontend/web


Hasta ahora, la solución más fácil y flexible para mí son los symlinks . Puede colocar el proyecto en cualquier lugar y solo crear enlaces simbólicos a directorios forzados por su alojamiento. Por ejemplo, coloque el proyecto en ~/domains/example.com/project y cree enlaces simbólicos al directorio 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

Y allí tienes http://example.com/ con frontend y http://example.com/admin/ con backend.

Si necesita backend en un dominio separado ( admin.example.com ):

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

Pros

  1. No hay reglas de reescritura retorcidas que casi nadie entienda.
  2. No tiene todo el proyecto en el directorio público, por lo que una configuración incorrecta del servidor web y / o PHP no publicará su código y archivos de configuración.
  3. Puede adaptar el proyecto a cualquier estructura requerida por el alojamiento.
  4. Si usa enlaces simbólicos relativos, puede mantenerlo bajo control de versiones y crear un único webroot con todas las aplicaciones como subdirectorios.

Contras

  1. Si tiene un alojamiento con algunas configuraciones restringidas de open_basedir sin ningún control sobre él, es posible que no pueda usarlo.

Prueba esto con el método .htaccess-

Paso 1

Cree el archivo .htaccess en la carpeta raíz, es decir, advanced/.htaccess y escriba el siguiente código.

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

Nota : si está intentando en el servidor local, reemplace ^/ con ^/project_name/ donde vea el signo de flecha. Elimine esos signos de flecha <------ después de que la configuración haya terminado.

Paso 2

Ahora cree un archivo de components/Request.php en el directorio común y escriba el código siguiente en este archivo.

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

Paso 3

Instalación de componentes. Escriba el código siguiente en los archivos frontend/config/main.php y backend/config/main.php respectivamente.

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

Paso 4 (Opcional, si no funciona hasta el paso tres)

crear un archivo .htaccess en el directorio web

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

Nota: asegúrese de haber habilitado su mod reescritura en apache

¡Eso es! Puedes probar tu proyecto con
www.project.com/admin , www.project.com

en servidor local
localhost/project_name/admin , localhost/project_name


Seguí la respuesta "deacs" y obtuve el siguiente error

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

luego creé la carpeta "assets" en "yii2app" y funciona

---------- Segundo método ------------------------

Sin mover archivos puede seguir el siguiente enlace

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

---------- Tercer método -----------------------------

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


Si su único objetivo es lograr no ver /frontend/web o /backend/web , incluso sin usar las reglas de .htaccess, puede hacer lo siguiente:

¿Por qué no simplemente extraer los contenidos de las carpetas web y colocarlos en la raíz? Simplemente ajuste la ruta de acceso al marco y los archivos de configuración en los scripts de entrada index.php .

Su estructura dir se vería así:

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

Su yii2app/index.php se vería así:

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

y su yii2app/admin/index.php se vería así:

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

EDITAR: sus scripts de entrada podrían verse diferentes a los míos, pero debería tener la idea de cambiar las rutas para encontrar los archivos de marco con estos ejemplos.