How to install Laravel 4 to a web host subfolder without publicly exposing /app/ folder?

I was wondering if any of you know of a way to install Laravel 4 in a web host SUBDIRECTORY / subfolder while not exposing the /app/ folder and other sensible files to the publicly accesible part of the host.

The idea is, I'd be able to access http://mydomain.com/mylaravel/ to be able to use Laravel, but at the same time I want to avoid anyone doing something like going to http://mydomain.com/app/ or http://mydomain.com/mylaravel/app/ and basically being able to see my config files and other code.


Solution 1:

So I figured out how to do this. I'll explain with an example.

Suppose you a domain, http://domain.com. Here's an example of the structure you might be using:

domain.com/    (the root of your web hosting)
|-- yourlaravel4_base/
|-- [some other folders...]
|-- public_html/    (where your html files and such go)
|   |-- [some other folders...]
|   |-- yourlaravel4/

/public_html/ is the root of the publicly accessible part of your web hosting files. You want to create a subfolder in /public_html/ (in this case /public_html/yourlaravel4/). In this subfolder you will store all the contents of the Laravel 4 public/ folder.

Now, for the rest of the files. You have to go to the root of your web hosting files, that is, you wanna be at domain.com/ level, therefore being able to see public_html/ and some other folders. Then, we need to create a folder here, where Laravel 4's base files will be stored. In this case, it's domain.com/yourlaravel4_base/. Inside yourlaravel4_base/ we need to store every file and folder that exists in the base Laravel 4 directory. That would be app/, bootstrap/, vendor/, server.php, etc. Everything EXCEPT the /public/ folder, whose contents you already stored in public_html/yourlaravel4/.

Finally, we need to edit 2 files: Laravel's /bootstrap/paths.php and /public/index.php.


In the paths.php file, replace:

'app' => __DIR__.'/../app',

with:

'app' => __DIR__.'/../../yourlaravel4_base/app',

In the paths.php file, replace:

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

with:

'public' => __DIR__,

In the paths.php file, replace:

'base' => __DIR__.'/..',

with:

'base' => __DIR__.'/../../yourlaravel4_base',

In paths.php, replace:

'storage' => __DIR__.'/../app/storage',

with:

'storage' => __DIR__.'/../../yourlaravel4_base/app/storage',

In index.php, replace:

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

with:

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

In index.php, replace:

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

with:

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

Upload changes. Now you should be able to have Laravel 4 installed in a subfolder in your website without actually exposing the app/ folder and other sensitive files. :)

Solution 2:

You can use an alias: no hankey-pankey with widespread directories on your system.

Specify in your httpd.conf or admin-panel:

/mylaravel/ /path/to/laravel/public

Furthermore, specify the URL in your Laravel's app.php

Line 29

'url' => 'http://yourdomain.com/mylaravel/',

Eventually set the RewriteBase in your /public/.htaccess

RewriteBase /mylaravel/

Works like a charm and keeps your directory structure clean and to the point!

Solution 3:

People, people! No need to over-complicate things!

(For other public folders, such as htdocs or www just replace public_html in the following with your one.)

  1. Put all your Laravel stuff in the top-level folder (so that the app folder is next to the public_html folder)
  2. Move all files from public to public_html (be sure to also move hidden files, such as .htaccess!)
  3. Delete the now empty public folder
  4. In bootstrap/path.php change

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

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

  5. Done.

Solution 4:

emmanuel answer doesnt work for me but i did some changes to make it work . although i used my web root to be the source of a project . there it is ; i have htdocs folder as a root folder but you may have other, such as public_html , www or so on . you can easily replace my htdocs with the one you have .

fine .

my dircetory

root/ 
      htdocs
      .htaccess
      .override

first i solved all of laravel dependencies on my localhost on windows with composer . after that i did pack the whole package into laravel4.zip . in my htdocs i create a laravel folder and i did upload and unzip the zip file in it.

htdocs/
        laravel/
                 app
                 bootstrap
                 public 
                 vendors
                 ...

so after i did unzip the file i move everything in public folder into htdocs folder

htdocs/
        laravel
        packages
        .htaccess
        favicon.ico
        index.php
        robots.txt

now we have to rewrite some pathes in htdocs/index.php and htdocs/laravel/bootstrap/paths.php

but lets open htdocs/laravel/bootstrap/paths.php . you would see

'app' => __DIR__.'/../app',

what does it mean . it means that we are standing at htdocs/laravel/bootstrap/ path . and there for we need exit this folder to laravel folder then going for app folder . ok . this is the structure of the laravel for routing . if you get this right you can make your laravel run .

find

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

and change it to

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

(simple ha ) with one (../) of these we can go up one folder . so now we are at laravel folder . but we need to be in htdocs . so we have to write another (../) to get there .

open htdocs/index.php and find

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

change it into

require 'laravel/bootstrap/autoload.php'; 

require is a built-in php function so we are going to treat it as a simple php . we dont realy need laravel style for fetching autoload.php file . so simply remove it and go for classic style

find

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

change it into

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

Solution 5:

If you are trying to run Laravel 5.1 into a shared hosting space and all of the above answers seems to be a bit different from the actual Laravel files/folders or you are looking how to put your laravel 5/5.1 into a sub directory on your shared hosting space so you can access it like this:

http://mywebsite.com/mylaravel/

So this answer is for you, first of all make sure you meet

Laravel 5.1 requirements :

- PHP 5.5
- PHP extension Mcrypt
- PHP extension Mbstring
- PHP extension OpenSSL

here an easy two tutorials for you :

Link 1

Link 2