php - htaccess para laravel
Laravel 5-Eliminar Public de URL (30)
¡NO!
¡REALMENTE NO DEBE
cambiar el nombre de
server.php
en su carpeta raíz de Laravel a
index.php
y copiar el archivo
.htaccess
del directorio
/public
a su carpeta raíz de Laravel!
De esta manera, todos pueden acceder a algunos de sus archivos (
.env
por ejemplo).
Inténtalo tú mismo.
¡No quieres eso!
HACER
En su lugar, debe crear un archivo
.htaccess
en su raíz como este:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Esto reescribirá silenciosamente todos sus URI base en la carpeta
/public
.
Incluso todos los
Headers
, por ejemplo,
el encabezado de autorización HTTP
, y todos los parámetros opcionales de URI se pasarán silenciosamente a la carpeta
/public
también.
¡Eso es todo!
Sé que esta es una pregunta muy popular, pero no he podido encontrar una solución que funcione para Laravel 5. He estado tratando de migrar desde Codeigniter durante mucho tiempo, pero este complicado proceso de instalación no me deja.
No quiero ejecutar una VM, esto simplemente parece incómodo al cambiar de proyecto.
No quiero establecer la raíz de mi documento en la carpeta pública, esto también es incómodo al cambiar de proyecto.
He probado el método .htaccess mod_rewrite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Esto solo me da una Laravel NotFoundHttpException en la línea compiled.php 7610.
Cuando probé L4 hace un tiempo, usé el método de mover el contenido de la carpeta pública a la raíz. La estructura de L5 es bastante diferente y seguir los mismos pasos rompió completamente Laravel (el servidor solo devolvería una página en blanco).
¿Existe un método decente para eliminar ''público'' en un entorno de desarrollo que:
- Funciona con L5
- Me permite cambiar entre proyectos con facilidad (generalmente estoy trabajando en 2 o 3 en cualquier momento).
Gracias
** Estoy usando MAMP y PHP 5.6.2
Laravel 5.5
Después de instalar Laravel por primera vez, me enfrenté al famoso "problema de la carpeta pública" y se me ocurrió esta solución que, en mi opinión personal , es "más limpia" que las otras que encontré en la Web.
Logros
-
No tengo palabra
public
en el URI -
Proteja el archivo
.env
contra personas curiosas
Todo se puede hacer simplemente editando
.htaccess
usando
mod_rewrite
y cuatro reglas simples.
Pasos
-
Mueva el archivo
.htaccess
enpublic/.htaccess
en la raíz principal - Edítalo como a continuación
Comenté todo, por lo que debería quedar claro (espero) también para aquellos que nunca han usado
mod_rewrite
(no es que sea un experto, todo lo contrario).
Además, para comprender las reglas, debe quedar claro que, en Laravel, si Bill se conecta a
https://example.com
, se carga
https://example.com/index.php
.
Este archivo solo contiene el
header("refresh: 5; https://example.com/public/")
del comando
header("refresh: 5; https://example.com/public/")
, que envía la solicitud a
https://example.com/public/index.php
.
Este segundo
index.php
es responsable de cargar el controlador y otras cosas.
# IfModule prevents the server error if the app is moved in an environment which doesn’t support mod_rewrite
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# RULES ORIGINALLY IN public/.htaccess ---
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# --- END
# PERSONAL RULES ---
# All the requests on port 80 are redirected on HTTPS
RewriteCond %{SERVER_PORT} ^80$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
# When .env file is requested, server redirects to 404
RewriteRule ^/.env$ - [R=404,L,NC]
# If the REQUEST_URI is empty (means: http://example.com), it loads /public/index.php
# N.B.: REQUEST_URI is *never* actually empty, it contains a slash that must be set as match as below
# .* means: anything can go here at least 0 times (= accepts any sequence of characters, including an empty string)
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*) /public/index.php [L]
# If the current request is asking for a REQUEST_FILENAME that:
# a) !== existent directory
# b) !== existent file
# => if URI !== css||js||images/whatever => server loads /public/index.php, which is responsible to load the app and the related controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^(css|js|images|media)/(.*)$ /public/index.php [L,NC]
# If the current request is asking for a REQUEST_FILENAME that:
# a) !== existent directory
# b) !== existent file
# => if URI == css||js||images[=$1]/whatever[=$2] => server loads the resource at public/$1/$2
# If R flag is added, the server not only loads the resource at public/$1/$2 but redirects to it
# e.g.: bamboo.jpg resides in example.com/public/media/bamboo.jpg
# Client asks for example.com/media/bamboo.jpg
# Without R flag: the URI remains example.com/media/bamboo.jpg and loads the image
# With R flag: the server redirects the client to example.com/public/media/bamboo.jpg and loads the image
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(css|js|images|media)/(.*)$ /public/$1/$2 [L,NC]
# --- END
</IfModule>
La siguiente regla (originalmente en
public/.htaccess
) se puede eliminar.
La misma regla, de hecho, se explicita de manera más detallada en las últimas dos reglas.
# Handle Front Controller...
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteRule ^ index.php [L]
EDITAR: Extrañé la solución de Abhinav Saraswat y su respuesta debería ser la aceptada. Solo una regla simple y clara que redirige todo el tráfico a la carpeta pública sin modificar ningún archivo.
Para Laravel 5:
-
Cambie el nombre de
server.php
en su carpeta raíz de Laravel porindex.php
-
Copie el archivo
.htaccess
del directorio/public
a su carpeta raíz de Laravel.
¡Eso es!
El problema es que si escribe / public y aún estará disponible en la url, por lo tanto, creé una solución que debería colocarse en public / index.php
$uri = urldecode(
parse_url($_SERVER[''REQUEST_URI''], PHP_URL_PATH)
);
if(stristr($uri, ''/public/'') == TRUE) {
if(file_exists(__DIR__.''/public''.$uri)){
}else{
$actual_link = (isset($_SERVER[''HTTPS'']) && $_SERVER[''HTTPS''] === ''on'' ? "https" : "http") . "://{$_SERVER[''HTTP_HOST'']}{$_SERVER[''REQUEST_URI'']}";
$actual_link = str_replace(''public/'', '''',$actual_link);
header("HTTP/1.0 404 Not Found");
header("Location: ".$actual_link."");
exit();
return false;
}}
esta paz de código eliminará el público de la url y dará un 404 y luego redirigirá a la url sin el público
Encontré la solución más funcional para este problema.
Simplemente edite su
.htaccess
en la
carpeta
raíz
y escriba el siguiente código.
Nada más requerido
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
RewriteCond %{REQUEST_URI} !(/.css|/.js|/.png|/.jpg|/.gif|robots/.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
RewriteRule ^.env - [F,L,NC]
RewriteRule ^app - [F,L,NC]
RewriteRule ^bootstrap - [F,L,NC]
RewriteRule ^config - [F,L,NC]
RewriteRule ^database - [F,L,NC]
RewriteRule ^resources - [F,L,NC]
RewriteRule ^vendor - [F,L,NC]
He intentado alguna solución aquí y encontré htaccess que funciona para laravel 5.2, como este:
RewriteRule ^your_file - [F,L,NC]
cuando tienes otro archivo o carpeta para prohibir solo agrega
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
No necesita hacer mucho, solo cree un archivo .htaccess en el directorio raíz y pegue / guarde el siguiente;
RewriteEngine on
RewriteCond %{REQUEST_URI} !public/
RewriteRule (.*) /public/$1 [L]
Puede eliminar la palabra clave pública de la URL utilizando varios métodos.
1) Si está utilizando un alojamiento dedicado y tiene acceso de root, puede eliminar la palabra clave pública de la url usando Virtual Host. Debe proporcionar la ruta DocumentRoot con public. Entonces esto iniciará el índice del directorio público y lo eliminará de la url.
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]
RewriteCond %{REQUEST_URI} (/./w+$) [NC]
RewriteRule ^(.*)$ public/$1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</IfModule>
2) Si no tiene acceso a la raíz de su alojamiento, entonces debe generar un nuevo archivo .htaccess en su directorio raíz y colocar el código de la siguiente manera
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]
<IfModule php7_module>
php_flag display_errors Off
php_value max_execution_time 30
php_value max_input_time 60
php_value max_input_vars 1000
php_value memory_limit -1
php_value post_max_size 8M
php_value session.gc_maxlifetime 1440
php_value session.save_path "/var/cpanel/php/sessions/ea-php71"
php_value upload_max_filesize 2M
php_flag zlib.output_compression Off
</IfModule>
Puedes obtener más reference aquí.
Sé que son una gran solución para este problema. La mejor y más fácil solución es agregar un archivo .htaccess en el directorio raíz .
Probé las respuestas que proporcionamos para este problema, sin embargo, me enfrenté a algunos problemas con auth: api guard en Laravel.
Aquí está la solución actualizada:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/{yoursourcedirectory}/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Cree el archivo .htaccess en su directorio raíz y agregue este código. Y todo va bien
agregue el archivo .htaccess a su carpeta raíz y pegue el siguiente código y reemplace su nombre de dominio con su propio nombre de dominio
RewriteEngine en RewriteCond% {HTTP_HOST} ^ (www.)? Yourdomainname $ RewriteCond% {REQUEST_URI}! ^ / Public /
RewriteCond% {REQUEST_FILENAME}! -F RewriteCond% {REQUEST_FILENAME}! -D
RewriteRule ^ (. *) $ / Public / $ 1
RewriteCond% {HTTP_HOST} ^ (www.)? Yourdomainname $ RewriteRule ^ (/)? $ /Public/index.php [L]
1) No he encontrado un método de trabajo para mover el directorio público en
L5
.
Si bien puede modificar algunas cosas en el bootstrap
index.php
, parece que varias funciones auxiliares se basan en la suposición de que ese directorio público está allí.
Honestamente, realmente no deberías mover el directorio público.
2) Si está utilizando MAMP, entonces debería crear nuevos vhosts para cada proyecto, cada uno de los cuales servirá ese directorio público de proyectos. Una vez creado, accede a cada proyecto por su nombre de servidor definido de esta manera:
http://project1.dev
http://project2.dev
4 mejores formas de eliminar público de la URL.
Si usó algún otro truco para eliminar el público de la URL, por ejemplo, cambie el nombre de server.php a index.php y cambie a la ruta principal del archivo. Claramente, no hagas eso. Entonces, ¿por qué Laravel no da la solución como esta porque no es una forma adecuada de hacerlo?
1) Eliminar public de URL usando htaccess en Laravel
Al agregar un archivo .htaccess en la raíz, puede acceder al sitio web sin público
<ifmodule mod_rewrite.c>
<ifmodule mod_negotiation.c>
Options -MultiViews
</ifmodule>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]
RewriteCond %{REQUEST_URI} (/./w+$) [NC]
RewriteRule ^(.*)$ public/$1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</ifmodule>
2) Elimine el público creando un host virtual en su local
Estoy dando una demostración aquí para el sistema operativo Windows. Pero intentaré definir un paso para que cualquiera pueda seguirlo fácilmente. También puede buscar en google lo mismo para el sistema operativo en particular.
Paso 1: Vaya a C: / Windows / system32 / drivers / etc / abra el archivo "hosts" en modo Administrador.
Paso 2: agregue el siguiente código. Aquí, le doy una demostración de la demostración del nombre de dominio projectname.local, puede especificar cualquiera que desee. Solo hazlo constante en cada lugar.
127.0.0.1 projectname.local
Paso 3:
Ahora vaya a
C:/xampp/apache/conf/extra
para usuarios de xampp y para el usuario de wamp
"C:/wamp/bin/apache/Apache2.4.4/conf/extra"
y abra
"httpd-vhosts.conf"
.
Ahora agregue el siguiente código en él.
Notas: Cambie la raíz del documento según su proyecto y también agregue el nombre de dominio que defina en el archivo "hosts".
<VirtualHost projectname.local>
ServerAdmin projectname.local
DocumentRoot "C:/xampp/htdocs/projectdir"
ServerName projectname.local
ErrorLog "logs/projectname.local.log"
CustomLog "logs/projectname.local.log" common
</VirtualHost>
Paso 4: Por último, pero el paso importante es reiniciar su Xampp o Wamp y acceder a la URL como
http://projectname.local
y su Laravel responderá sin URL pública.
3) Eliminar el público ejecutando el comando en Laravel
Si está trabajando en local, entonces no necesita hacer nada, solo necesita ejecutar el siguiente comando desde su terminal o herramienta de línea de comando. Después de eso, puede acceder a su sitio web mediante la URL proporcionada por la línea de comando.
> php artisan serve
Si está dispuesto a ejecutar su proyecto en una IP particular, entonces necesita ejecutar el siguiente comando. Si está trabajando en LAN, entonces si desea permitir que otras personas accedan a su sitio web desde local, entonces solo necesita verificar su dirección IP usando la línea de comando ejecutando "ipconfig" después de ejecutar su dirección IP siguiendo el comando.
> php artisan serve --host=192.168.0.177
Si está dispuesto a ejecutar su proyecto en una IP particular con un puerto particular, entonces necesita el siguiente comando.
> php artisan serve --host=192.168.0.177 --port=77
4) Eliminar el público en el servidor alojado o en el panel de control
Después de completar el proyecto, debe alojar el proyecto en el servidor, luego solo debe configurar la raíz del documento en su dominio en la carpeta pública. Mira la siguiente captura de pantalla.
Según la captura de pantalla, si no tiene ninguna carpeta de proyecto en public_html, solo necesita configurar la raíz del documento como
"public_html/public"
.
@ rimon.ekjon dijo:
Cambie el nombre del servidor.php en la carpeta raíz de Laravel a index.php y copie el archivo .htaccess del directorio / public a su carpeta raíz de Laravel. -- Eso es !! :)
Eso me funciona. Pero todos los archivos de recursos en el directorio / public no pudieron encontrar y solicitar URL no funcionaron, porque utilicé el ayudante de activo ().
Cambié /Illuminate/Foundation/helpers.php/asset () funciona de la siguiente manera:
function asset($path, $secure = null)
{
return app(''url'')->asset("public/".$path, $secure);
}
Ahora todo funciona :)
Gracias @ rimon.ekjon y a todos ustedes.
Aquí está la solución mejor y más corta que funciona para mí a partir de mayo de 2018 para Laravel 5.5
-
simplemente corte su archivo
.htaccess
del directorio / public al directorio raíz y reemplácelo con el siguiente código:<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] RewriteCond %{REQUEST_URI} !(/.css|/.js|/.png|/.jpg|/.gif|robots/.txt)$ [NC] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ server.php [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC] </IfModule>
-
Simplemente guarde el archivo
.htaccess
y eso es todo. -
Cambie el nombre de su archivo
server.php
aindex.php
. eso es todo disfrutar!
Cree el archivo
.htaccess
en el directorio
raíz
y coloque el código como se muestra a continuación.
require __DIR__.''/../bootstrap/autoload.php'';
$app = require_once __DIR__.''/../bootstrap/app.php'';
Digamos que colocó todos los demás archivos y directorios en una carpeta llamada ''locale''.
Simplemente vaya a index.php y encuentre estas dos líneas:
require __DIR__.''/locale/bootstrap/autoload.php'';
$app = require_once __DIR__.''/locale/bootstrap/app.php'';
y cambiarlos a esto:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]
RewriteCond %{REQUEST_URI} (/./w+$) [NC]
RewriteRule ^(.*)$ public/$1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</IfModule>
En Laravel 5.5, cree el archivo .htacess en su directorio raíz y coloque el siguiente código: - Enlace de referencia
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]
RewriteCond %{REQUEST_URI} (/./w+$) [NC]
RewriteRule ^(.*)$ public/$1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</IfModule>
En primer lugar puedes usar estos pasos
Para Laravel 5:
1. Cambie el nombre de server.php en su carpeta raíz de Laravel por index.php
2. Copie el archivo .htaccess del directorio / public a su carpeta raíz de Laravel.
fuente: share
después de seguir estos pasos, debe cambiar todas las rutas de CSS y script, pero esto será agotador.
Propuesta de solución
: simplemente puede hacer cambios menores en la función
helpers::asset
.
Para esto :
-
vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
abiertovendor/laravel/framework/src/Illuminate/Foundation/helpers.php
-
ir a la línea 130
-
escriba
"public/".$path
lugar de$path
,function asset($path, $secure = null){ return app(''url'')->asset("public/".$path, $secure); }
Es posible eliminar la URL pública en laravel5. Sigue estos pasos:
Paso 1. Copie todo el archivo del público y péguelo en el directorio raíz
paso 2.abrir el archivo
index.php
reemplazar con
require __DIR__.''/../bootstrap/autoload.php'';
a
require __DIR__.''/bootstrap/autoload.php'';
y
$app = require_once __DIR__.''/../bootstrap/app.php'';
a
$app = require_once __DIR__.''/bootstrap/app.php'';
Y elimine todo el caché y las cookies.
He leído algún artículo antes y está funcionando bien, pero realmente no sé si es seguro o no
a. Create new folder local.
b. Move all project into the local folder expect public folder.
c. Move all the content of public folder to project root.
d. Delete the blank public folder
f. Edit the index file.
Edite el index.php
require __DIR__.''/../bootstrap/autoload.php'';
$app = require_once __DIR__.''/../bootstrap/app.php'';
a
require __DIR__.''/local/bootstrap/autoload.php'';
$app = require_once __DIR__.''/local/bootstrap/app.php'';
He resuelto el problema usando 2 respuestas:
- Cambiar el nombre del servidor.php a index.php (sin modificaciones)
- Copie el archivo .htaccess de la carpeta pública a la carpeta raíz (como rimon.ekjon dijo a continuación)
-
Cambiando .htaccess un poco como sigue para las estadísticas:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] RewriteCond %{REQUEST_URI} !(/.css|/.js|/.png|/.jpg|/.gif|robots/.txt)$ [NC] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
Si se necesitan otros archivos estáticos, simplemente agregue la extensión a la lista declarada anterior
Incluso si no recomiendo poner Laravel en la carpeta raíz, hay algunos casos en los que no se puede evitar; para esos casos, los métodos anteriores no funcionan para los activos, por lo que hice una solución rápida cambiando el htaccess: después de copiar server.php a index.php, edite el archivo .htaccess de la siguiente manera:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
### fix file rewrites on root path ###
#select file url
RewriteCond %{REQUEST_URI} ^(.*)$
#if file exists in /public/<filename>
RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
#redirect to /public/<filename>
RewriteRule ^(.*)$ public/$1 [L]
###############
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
#RewriteCond %{REQUEST_FILENAME} -d # comment this rules or the user will read non-public file and folders!
#RewriteCond %{REQUEST_FILENAME} -f #
RewriteRule ^ index.php [L]
</IfModule>
Esta fue una solución rápida que tuve que hacer para que cualquiera pueda actualizarla.
Manera fácil de eliminar public de laravel 5 url. Solo necesita cortar index.php y .htaccess del directorio público y pegarlo en el directorio raíz, eso es todo, y reemplazar dos líneas en index.php como
require __DIR__.''/bootstrap/autoload.php'';
$app = require_once __DIR__.''/bootstrap/app.php'';
Nota : El método anterior es solo para los principiantes, ya que pueden tener problemas para configurar el host virtual y la mejor solución es configurar el host virtual en la máquina local y señalarlo al directorio público del proyecto.
Me gustaría agregar a @Humble Learner y tener en cuenta que la ubicación adecuada para "arreglar" la ruta de URL de los activos es /Illuminate/Routing/UrlGenerator.php/asset ().
Actualice el método para que coincida:
public function asset($path, $secure = null)
{
if ($this->isValidUrl($path)) return $path;
$root = $this->getRootUrl($this->getScheme($secure));
return $this->removeIndex($root).''/public/''.trim($path, ''/'');
}
Esto arreglará scripts, estilos y rutas de imágenes. Cualquier cosa por rutas de activos.
Otro método que uso es crear un enlace simbólico (en Linux, no sé acerca de Win) usando el comando ln en htdocs o www, es decir,
ln projectname/public project
El sitio es accesible a través de localhost / project
Para que el usuario de XAMPP elimine el público de la URL sin tocar el sistema de archivos predeterminado de laravel, debe configurar un host virtual para que su aplicación haga esto, solo siga estos pasos
-
Abra la aplicación del panel de control XAMPP y detenga Apache. Tenga en cuenta que las máquinas con Windows tardías pueden ejecutarlo como un servicio, así que marque la casilla a la izquierda del módulo Apache.
-
Navegue a
C:/xampp/apache/conf/extra
o donde se encuentren sus archivos XAMPP. -
Abra el archivo llamado httpd-vhosts.conf con un editor de texto.
-
Alrededor de la línea 19 encuentre #
NameVirtualHost *:80
y descomente o elimine el hash. -
En la parte inferior del archivo, pegue el siguiente código:
<VirtualHost *>
ServerAdmin [email protected]
DocumentRoot "C:/xampp/htdocs" # change this line with your htdocs folder
ServerName localhost
ServerAlias localhost
<Directory "C:/xampp/htdocs">
Options Indexes FollowSymLinks Includes ExecCGI
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
- Ahora puede copiar y pegar el código de arriba para agregar sus directorios de Virtual Host. Por ejemplo, estoy trabajando en un sitio llamado Eatery Engine, por lo que el siguiente fragmento me permitirá trabajar con subdominios en mi instalación local:
<VirtualHost eateryengine.dev>
ServerAdmin [email protected]
DocumentRoot "C:/xampp/htdocs/eateryengine" # change this line with your htdocs folder
ServerName eateryengine.dev
ServerAlias eateryengine.dev
<Directory "C:/xampp/htdocs/eateryengine">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
-
Luego dirígete a tu archivo de host de Windows para editar tus HOSTS.
el archivo se ubicará en
C:/Windows/System32/drivers/etc/hosts
, donde hosts es el archivo. Ábralo con el bloc de notas. - Busque la resolución de nombre #localhost que se maneja dentro del mismo DNS.
127.0.0.1 localhost
La resolución del nombre localhost se maneja dentro del DNS mismo.
127.0.0.1 localhost
127.0.0.1 eateryengine.dev #change to match your Virtual Host.
127.0.0.1 demo.eateryengine.dev #manually add new sub-domains.
- Reinicia Apache y prueba todo.
El artículo original se puede encontrar here
Siempre hay una razón para tener una carpeta pública en la configuración de Laravel, todas las cosas públicas relacionadas deben estar presentes dentro de la carpeta pública,
No apunte su dirección IP / dominio a la carpeta raíz de Laravel, sino que apunte a la carpeta pública. No es seguro apuntar el servidor Ip a la carpeta raíz, porque a menos que escriba restricciones en
.htaccess
, uno puede acceder fácilmente a los otros archivos.
Simplemente escriba la condición de reescritura en el archivo
.htaccess
e instale el módulo de reescritura y habilite el módulo de reescritura, el problema que agrega público en la ruta se resolverá.
Simplemente cree el archivo .htaccess en la raíz y agréguele estas líneas
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]
¡Eso es!
El código anterior funciona en la carpeta public_html raíz. Dicho esto, su archivo laravel principal debe estar dentro de la carpeta public_html, si su directorio se ve como public_html / laravelapp / public y si coloca el código anterior dentro de laravelapp, no funcionará. Por lo tanto, debe copiar todos sus archivos principales en public_html y colocar el archivo .htaccess allí.
Si desea mantener el código en un subdirectorio, puede crear un subdominio y este código también funcionará para eso.
MEJOR enfoque:
no recomendaré eliminar public, en su lugar,
on local computer create a virtual host point to public directory
y,
on remote hosting change public to public_html and point your domain to this directory
.
Razón, todo su código laravel será seguro porque tiene un nivel inferior a su directorio público :)
MÉTODO 1:
Acabo de cambiar el nombre de
server.php
a
index.php
y funciona
MÉTODO 2:
Esto funciona bien para todas las versiones de laravel ...
Aquí está mi estructura de directorios,
/laravel/
... app
... bootstrap
... public
... etc
Sigue estos sencillos pasos
- mover todos los archivos del directorio público a root / laravel /
- ahora, no necesita un directorio público, por lo que opcionalmente puede eliminarlo ahora
- ahora abra index.php y realice los siguientes reemplazos
requiere DIR . ''/ .. / bootstrap / autoload.php'';
a
requiere DIR . ''/ bootstrap / autoload.php'';
y
$ app = require_once DIR . ''/ .. / bootstrap / start.php'';
a
$ app = require_once DIR . ''/ bootstrap / start.php'';
- ahora abra bootstrap / paths.php y cambie la ruta del directorio público:
''public'' => DIR . ''/ .. / public'',
a
''public'' => DIR . ''/ ..'',
y eso es todo, ahora intenta http: // localhost / laravel /
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteRule ^(.*)$ public/$1 [L]
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
Active el módulo mod_rewrite con
sudo a2enmod rewrite
y reiniciar el apache
sudo service apache2 restart
Para usar mod_rewrite desde archivos .htaccess (que es un caso de uso muy común), edite el VirtualHost predeterminado con
sudo nano /etc/apache2/sites-available/000-default.conf
Debajo de "DocumentRoot / var / www / html" agregue las siguientes líneas:
<Directory "/var/www/html">
AllowOverride All
</Directory>
Reinicie el servidor nuevamente:
sudo service apache2 restart