Cómo cambiar la carpeta pública a public_html en Laravel

6 minutos de lectura

Avatar de usuario de Ravexina
Ravexina

Estoy usando un alojamiento compartido que usa cPanel como su panel de control y dentro de cPanel public_html es el directorio raíz predeterminado, debido a esto no puedo hacer que mi aplicación Laravel funcione correctamente.

¿Hay alguna forma de hacer que Laravel use public_html en lugar de carpeta pública?

Avatar de usuario de Robert
Roberto

Bastante fácil de encontrar esto con una simple búsqueda.

Ver: https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5

En su index.php agregue las siguientes 3 líneas.

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/

$app = require_once __DIR__.'/../bootstrap/app.php';

// set the public path to this directory
$app->bind('path.public', function() {
    return __DIR__;
});

Editar:


Como mencionó Burak Erdem, otra opción (y más preferible) es poner esto en el \App\Providers\AppServiceProvider register() método.

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    // ...

    $this->app->bind('path.public', function() {
        return base_path('public_html');
    });
}

  • no funciona para mí: error fatal: llamar a una función miembro make () en un no objeto en …

    – Ravexina

    13 mayo 2015 a las 17:14

  • Solo agregando eso? Puedo cambiarlo sin ningún error. ¿Puede publicar el mensaje de error completo? No me dice mucho.

    – Roberto

    13 mayo 2015 a las 19:45

  • @Robert cuando uso tu solución, me da error [ErrorException] chdir(): No such file or directory (errno 2) .

    – Faisal Ahsan

    18 de marzo de 2016 a las 7:54

  • Sé que ha sido hace bastante tiempo, pero esta pregunta todavía ocupa un lugar destacado en Google. Por lo tanto, quería señalar que, para mí, estas líneas de código deben agregarse DESPUÉS de la Turn On The Lights-sección. Entonces deberías actualizar path.public a path.public_html. Al menos, eso funcionó para mí. 🙂

    – Carsten

    1 de julio de 2016 a las 8:22

  • Esto no funciona para laravel-mix, que aún compila activos en el public directorio.

    – Lars Nyström

    4 de febrero de 2018 a las 15:11

Avatar de usuario de Burak Erdem
Burak Erdem

si es de roberto index.php solución no funciona para usted, también puede registrar el siguiente código en Proveedor de servicios de aplicaciones (App\Providers\AppServiceProvider.php).

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

public function register()
{
    $this->app->bind('path.public', function() {
        return base_path().'/public_html';
    });
}

  • Prefiero usar este método. Ha trabajado en Laravel 5.3.

    – Muhammad Zamroni

    23 de abril de 2017 a las 3:54

  • Prefiero este, porque es más probable que index.php cambie en la actualización del marco

    –Mladen Janjetovic

    31 de marzo de 2018 a las 19:58

  • ¿Se supone que esta respuesta dice public_html en lugar de public_http?

    – hannebaumsaway

    1 de febrero de 2021 a las 17:16

  • Estoy usando laravel 5.7 y esto no funciona, ¿hay algo que deba hacer?

    – Hemant Kumar

    20 de mayo de 2021 a las 7:49

Avatar de usuario de David
David

Servidor

Los métodos descritos en el tema funcionan bien, por lo que modificar el método de registro App\Providers\AppServiceProvider.php debería hacer el trabajo:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

public function register()
{
    $this->app->bind('path.public', function() {
        return base_path() . '/public_http';
    });
}

Desarrollo local de servicios php artesanales

Sin embargo, hay un problema más que puede experimentar. Si está desarrollando su aplicación en una máquina local y está utilizando php artisan serve comando para servir su aplicación, la romperá solo con la sintaxis anterior. Todavía necesita ajustar el archivo server.php que existe en el directorio principal. Edite el contenido del mismo y reemplace cada aparición de /public a /public_htmlpor lo que se ve así:

<?php

/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <taylor@laravel.com>
 */

$uri = urldecode(
    parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);

// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== "https://stackoverflow.com/" && file_exists(__DIR__.'/public_html'.$uri)) {
    return false;
}

require_once __DIR__.'/public_html/index.php';

Después. Simplemente detenga su servidor y recárguelo con php artisan serve.

Desarrollo front end laravel-mix

Si está utilizando webpack y laravel-mix para generar sus archivos css y js, esto también necesita alguna actualización. Sin ajustar webpack.mix.js, terminará con algo como esto en npm run watch o npm run production:

.
..
public
  _html
    js
  public_html
    css
public_html

Así que va a estropear tu código. Para aclarar esto, debe proporcionar una ruta pública a su archivo webpack.mix.js. Podría verse así:

const mix = require('laravel-mix');

mix.setPublicPath('public_html/');
mix.js('resources/js/app.js', 'js')
mix.sass('resources/sass/app.scss', 'css');

Esto va a cambiar la definición predeterminada de directorio público de public a public_html y las siguientes líneas proporcionan una ruta relativa a su valor setPublicPath.

Codificación feliz.

  • ¡Gracias por su respuesta! esto funciona muy bien, excepto por vue. compila css y js en la carpeta adecuada (en mi caso es /../public_html) pero no funcionan. cuando compila app.js no tiene en cuenta la ruta de los archivos .vue: ./resources/js/components/SetBgImg.vue?vue&type=script&lang=js&":debiera ser ./../projectname/resources/js/components/SetBgImg.vue?vue&type=script&lang=js&": ¿Cómo se puede arreglar esto`?

    – energía de tiburón

    11 de abril de 2020 a las 13:50

  • No olvides reiniciar npm run para permitir que los cambios surtan efecto.

    – Fer Tostado

    19 de febrero de 2021 a las 18:00

  • No uso vue, pero hoy en día esta respuesta funciona para localhost y me deshago de copiar y pegar activos en la carpeta pública del proyecto sincronizado en la nube cada maldita vez.

    – Código para la vida

    22 de abril de 2021 a las 19:02


Avatar de usuario de Ahmadreza
Ahmadreza

Ir a esta dirección:

/app/Providers/AppServiceProvider.php

y agregue este código al final del archivo:

public function register()
{   $this->app->bind('path.public', function() {
    return realpath(base_path().'/../public_html');
  });
}

Solo quiero actualizar todas las respuestas anteriores, si su public_html no está dentro de la carpeta laravel, entonces necesita usar este código:

$this->app->bind('path.public', function() {
   return realpath(base_path().'/../public_html');
});

Avatar de usuario de Saif uddin
saif uddin

El directorio raíz simple crea el archivo .htaccess y agrega el código:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Avatar de usuario de Mike Rockétt
Mike Rockett

Para aquellos que necesitan cambiar la ruta pública para que también esté disponible para Artisan, agregue lo siguiente a bootstrap/app.phpjusto después de la última singleton método:

$app->bind('path.public', function () {
    return base_path("<your public directory name>");
});

¿Ha sido útil esta solución?