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
- No hay reglas de reescritura retorcidas que casi nadie entienda.
- 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.
- Puede adaptar el proyecto a cualquier estructura requerida por el alojamiento.
- Si usa enlaces simbólicos relativos, puede mantenerlo bajo control de versiones y crear un único webroot con todas las aplicaciones como subdirectorios.
Contras
-
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.