Laravel 5 – Remove Public from URL
PLEASE NOTE when serving a Laravel project with Docker: you won't need to do any of this. Only use this option when your root (or more commonly: public_html
) directory of your website is your Laravel project (this is not the case when you're using Docker).
DON'T!
YOU REALLY SHOULD NOT rename server.php
in your Laravel root folder to index.php
and copy the .htaccess
file from the /public
directory to your Laravel root folder!!!
This way everyone can access some of your files (.env
for example). Try it yourself. You don't want that!
DO
Instead, you should create an .htaccess
file in your root like this:
RewriteEngine OnRewriteCond %{REQUEST_URI} !^/public/RewriteRule ^(.*)$ /public/$1 [L,QSA]
This will silently rewrite all your base URIs to the /public
folder. Even all Headers, for example the HTTP Authorization Header, and all optional URI parameters will silently be passed on to the /public
folder as well.
That's all
I have solved the issue using 2 answers:
- Renaming the server.php to index.php (no modifications)
- Copy the .htaccess from public folder to root folder(like rimon.ekjon said below)
Changing .htaccess it a bit as follows for statics:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)/$ /$1 [L,R=301]RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]RewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^ index.php [L]RewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_URI} !^/public/RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
If there are any other static files needed just add the extension to the previous declared list