Removing the /public segment in a Laravel 4 app

Published on Mar 31, 2013

A new version of the article is here, if you're using Laravel 5.


Laravel 4 requires you to put your app code one level higher than the web root, and this causes problems for some developers that are stuck on shared hosting and that doesn't allow a setup like this. It's actually really easy to get around it. I read that some L4 specific packages could have problems on a setup like this, but I didn't experience anything like that with any package yet.

So first install L4 somewhere you like. I liked the article Niall wrote on keeping the base L4 app up to date, so go and check that out: Installing and Updating Laravel 4

I find it's enough for this example to simply clone the repo (assuming you have composer installed globally, if not, go to http://getcomposer.org/:

git clone -b develop git://github.com/laravel/laravel.git app_name
php composer install

Note that we are cloning the develop branch since L4 is still in beta at this time.

So to remove the "public" part from your URL, simply move all files and folders from public to your app root and you'll end up with a folder structure like this:

/app
/bootstrap
/packages (copied from /public)
/vendor
.htaccess (copied from /public)
artisan
composer.json
favicon.ico (copied from /public)
index.php (copied from /public)
robots.txt (copied from /public)
server.php

Now we need to edit our paths in index.php:

require __DIR__.'/bootstrap/autoload.php';

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

And then just set the public dir in out /bootstrap/paths.php file:

'public' => __DIR__.'/..',

This is it!