Sagiruddin Mondal
Sagiruddin Mondal

Reputation: 5787

Avoid public folder of laravel and open directly the root in web server

I was going through all possible sample on internet to solve this. Still it is an headache.

I just want to avoid the 'public' in www.mylaravelsite.com/public/ and make it like www.mylaravelsite.com for the root directory.

Now I do not want to avoid the security concern,So I learned .htaccess would be the best way.

Any solution friends ?

& advance thanks for interacting !

Upvotes: 49

Views: 109677

Answers (10)

Imad Ullah
Imad Ullah

Reputation: 1208

create .htacess file in the root directory of your laravel project and put this code in.

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

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

OR add this code in your .htaccess

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

Upvotes: 7

Shakil Alam
Shakil Alam

Reputation: 447

On Server(Apache) Create .htaccess in the root folder and write below line

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

Lean more on Gist

On Local Development You can create a virtual host by adding the below line to your apache vhost config file. Generally, you can find this file in C:\xampp\apache\conf\extra\httpd-vhosts.conf file

<VirtualHost *:80>
  DocumentRoot "C:/xampp/htdocs/mysite/public/"
  ServerName www.mysite.local
</VirtualHost>

Upvotes: 0

xuanhvh
xuanhvh

Reputation: 1

For Lumen

Let's think you have a folder path like: /var/www/project/microservice(lumen src)

/var/www => document root for localhost/

Target you want: localhost/project/microservice[/foo...] => localhost/project/microservice/public/foo...

I do this by .htaccess (placed at /project folder) like below:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^.*/public/.*
RewriteCond %{REQUEST_URI} ^(/[^/]+/[^/]+/).*
RewriteRule ^[^/]+(.*)$ %1public$1 [L,R=301,P]

Upvotes: 0

Atul Shah
Atul Shah

Reputation: 89

Just add .htaccess file on Laravel root if it's not present and add following lines in it, that's it,

<IfModule mod_rewrite.c>  
   RewriteEngine On 
   RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Upvotes: 8

Muhammad Sadiq
Muhammad Sadiq

Reputation: 1155

Here is the solution, But Must not do it in real projects, it is just for starter to test Laravel and i have tested it with laravel 5.0 and it is ,cut index.php and .htaccess files from public folder and paste it in the root directory and change these two lines as

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';

It is Highly Recommended not to use the above method without testing environment, and should use virtual host instead.

Upvotes: 3

Chetan Bhootra
Chetan Bhootra

Reputation: 11

All you just need to change .env file in your laravel project files. if your laravel project inside in

Root/domain/public_html/laravel/

Go to .env file and edit

you need to edit app url path which should be

APP_URL=http://www.domainname.com/laravel/public/

Thats it your project will run now. if your laravel files is in public_html, then your app url must be like this

APP_URL=http://www.domainname.com

Thanks

Upvotes: 1

Anik
Anik

Reputation: 471

Create .htaccess in root folder and write these line

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

For production server it is recommended that you point your domain directly to the public folder

Upvotes: 37

lukaserat
lukaserat

Reputation: 4896

Let's assume you have this folder structure in your server

.cpanel/
public_html/
public_ftp/
..

And the laravel folder structure is

app/
bootstrap/
public/
vendor/
composer.json
artisan
..

You can create a folder name mylaravelsite on your server inline with public_html and public_ftp folder, and copy to it the whole laravel application except the public folder because you will paste all of it contents on the public_html, so you have now:

.cpanel/
public_html/
public_html/packages
public_html/vendor
public_html/index.php
public_html/.htaccess
...
public_ftp/
mylaravelsite/
mylaravelsite/app
mylaravelsite/bootstrap
...

On your public_html/index.php change the following line:

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

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

to

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

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

and also don't forget to change /mylaravelsite/bootstrap/paths.php public path, you might use it.

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

to

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

Your site should be running.

Upvotes: 60

fideloper
fideloper

Reputation: 12293

It sounds like the information you are missing is:

Documentroot

This is also called the "web root". Apache specifically calls it the DocumentRoot - Click that link for the official explanation.

Basically what it does is set which directory the server pulls files from. In Laravel, the document root should be the public folder.

Setting the DocumentRoot to public means that going to http://mylaravelsite.com in the browser will infact be "pointing" to the public folder as you want.

In the .htaccess file (actually, more likely in the virtual host configuration), you can set the DocumentRoot for your site:

DocumentRoot /path/to/laravel-app/public

How you set this up depends on your hosting. Each hosting has different ways to setup a website and so we cannot answer that specifically for you - you should consult your web hostings tech support. The key point is that the public directory should be the web root, while everything else should be "behind the web root".

Fair warning tho: some hosting providers do not give you enough access to accomplish that.

Upvotes: 17

lukaserat
lukaserat

Reputation: 4896

point your web directory to public/. If you are using apache this will work:

<VirtualHost *:80>
  DocumentRoot /var/www.mylaravelsite.com/public/
  ServerName www.mylaravelsite.com
</VirtualHost>

Upvotes: 5

Related Questions