Shalin Nipuna
Shalin Nipuna

Reputation: 488

Remove public from URL in Laravel 9 using .htaccess on shared hosting/CPanel hosting

I am trying to host a Laravel 9 application on a Cpanel shared host. However, the application keeps returning the below error even when I try to access https://example.com/public. Also below is my .htaccess file at the root; it used to work perfectly with Laravel 8 but is not working anymore. My problem is I want to access my application just using the domain without /public or /public.index.php (e.g., example.com).

Internal server error 500

.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^public
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Upvotes: 3

Views: 11063

Answers (2)

Hellam Imbosa
Hellam Imbosa

Reputation: 89

How to remove public from url in laravel 9

  • create a .htaccess file in root directory

  • Add this code

    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
    
  • create server.php in the root directory

  • Add this code

    $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'.$uri)) {
        return false;
    }
    
    require_once __DIR__.'/public/index.php';
    

Upvotes: 8

MrWhite
MrWhite

Reputation: 45988

RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]

You are missing the slash prefix on the CondPattern !^public, so this condition will always be successful and repeatedly rewrite the request, potentially causing a rewrite loop (ie. 500 error).

It should be like this instead:

RewriteCond %{REQUEST_URI} !^/public($|/)
RewriteRule ^(.*)$ public/$1 [L]

HOWEVER, you should also have another .htaccess file with mod_rewrite directives in the /public subdirectory that manages the routing through your Laravel app, and this should prevent a rewrite-loop.

Upvotes: 4

Related Questions