How to separate public folder in laravel
Published: 2022-01-16 12:44:05

**Hi**,everyone know that is really difficult to host **Laravel** project on shared host because they give just one folder **public_html**, and is the only entry point folder. but the structure of Laravel entry point of laravel is not the** root of project ** is **root_project/public**.

## So how can i host **Laravel** in this situation ??
 The best solution is to separate **public folder** from **Laravel** project.
From  structure
![structure](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/84e9uxja2kcafthxtxhv.png)
To structure
![structure](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3btfr1u5fukqi2iuicsp.png)
With new structure we move public folder outside src code.
so now we change the name of folder **public** to **public_html** to host the project. 
![hosting](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zfw13t7gx62w3dhhz7ad.jpg)

First we should bind public_path in **bootstrap/app.php**
 
```php
// add this before return $app;
$app->bind('path.public', function () {
    return base_path() . '/../public_html';
});
```
After that we need  update path in **server.php** and **index.php 
**

**server.php **

```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 !== '/' && file_exists(__DIR__ . '/../public_html' . $uri)) {
    return false;
}

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

```
**index.php in public_html**

```php

<?php

use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

/*
|--------------------------------------------------------------------------
| Check If The Application Is Under Maintenance
|--------------------------------------------------------------------------
|
| If the application is in maintenance / demo mode via the "down" command
| we will load this file so that any pre-rendered content can be shown
| instead of starting the framework, which could cause an exception.
|
*/

if (file_exists(__DIR__ . '/../src/storage/framework/maintenance.php')) {
    require __DIR__ . '/../src/storage/framework/maintenance.php';
}

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| this application. We just need to utilize it! We'll simply require it
| into the script here so we don't need to manually load our classes.
|
*/

require __DIR__ . '/../src/vendor/autoload.php';

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request using
| the application's HTTP kernel. Then, we will send the response back
| to this client's browser, allowing them to enjoy our application.
|
*/

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

$kernel = $app->make(Kernel::class);

$response = $kernel->handle(
    $request = Request::capture()
)->send();

$kernel->terminate($request, $response);

```

That all isn't simple !!!,now you can easily host laravel project on shared hosting any problem of storage or anything else. 
you can clone an example from repo  [laravel-new-structure](https://github.com/jamalroger/laravel-new-structure)

I hope that you the article and see you again with another article.

![end](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mbywvf6972vitmqwani3.png)