Search code examples
laravelshared-hosting

Hostinger - Laravel - Shared hosting


I have a Laravel 9 App that I deployed on hostinger shared hosting.

My site files look like this public_html/laravel-app.

In public_html file I don't have an index.php file to change the required bootstrap linked to access the Laravel application.. So all requests currently look like this: domain/laravel-app/public/index.php/{ROUTE}.

How can I fix it so it looks like: domain/{ROUTE}?


Solution

  • First of all I give credit in this to @apokryfos, @user83129 and @andylondon. The solution was a combination of there help.

    1. Step 1 was the .htaccess file for security as @andylondon said but should look like this (added laravel-app before public):
    RewriteEngine on
    
    # serve existing files in the /public folder as if they were in /
    RewriteCond %{DOCUMENT_ROOT}public%{REQUEST_URI} -f
    RewriteRule (.+) /laravel-app/public/$1 [L]
    
    # route everything else to /public/index.php
    RewriteRule ^ /laravel-app/public/index.php [L]
    
    1. Step 2 I copied the contents of laravel-app/public to public_html
    2. Step 3 I updated public_html/index.php to look exactly like this:
    <?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($maintenance = __DIR__.'/store-api-9/storage/framework/maintenance.php')) {
        require $maintenance;
    }
    
    /*
    |--------------------------------------------------------------------------
    | 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__.'/laravel-app/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__.'/laravel-app/bootstrap/app.php';
    
    $kernel = $app->make(Kernel::class);
    
    $response = $kernel->handle(
        $request = Request::capture()
    )->send();
    
    $kernel->terminate($request, $response);
    

    PS: laravel-app added in my answer is a custom name in which I named the directory containing my deployed Laravel app in public_html and can be changed according to each developer.