Laravel 4 removing public from URL

2019-01-06 14:20发布

问题:

So, I'm running xampp on Windows. I'm currently trying to get familiar with the laravel framework. Now, when thats pointed out. How can i be able to access my laravel application/website direct within the root?

Example,

  • What I'm doing now is: localhost/laravel/public/about (to see the about page)
  • What i want to do is: localhost/laravel/about

Any good solutions for this? do i need to add a .htacess file on the root folder of laravel? (not the public one).

Any suggestions?

回答1:

Easiest way is create .htaccess file in your Laravel root with following content:

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

It should be redirected easily.

Reference: https://coderwall.com/p/erbaig/laravel-s-htaccess-to-remove-public-from-url



回答2:

Here's how I did it.

  1. Edit your Windows Host file - C:\Windows\System32\drivers\etc\hosts
  2. Edit the Apache vhosts file - Drive-Letter:\xampp\apache\conf\extra\httpd-vhosts.conf
  3. Add an htaccess file to the laravel/public folder (if its not already there)
  4. Restart Xampp apache server

Windows can be a real PITA when trying to edit the Hosts file because of the User Account Control. Since I work on all kinds of small hobby projects, I have to edit this file all the time so this is what I do.

  • Install PSPad. It loads really fast and you can bookmark files for easy loading/editing. Sublime Text also works well if you load the two files I mentioned above and save the workspace as a new project.
  • Right-click on the PSPad (or other editor) program shortcut and choose 'Run as Administrator'. You cannot save changes to the Hosts file unless you do this.
  • Open the Windows Host file in the editor. This file does not have a file extension, so you have to choose "All Files" in the File Open dialog to even see the file.
  • At the bottom of the file, add this:

    127.0.0.1  laravel.dev
    

    This tells Windows to point the web browser to localhost whenever you enter laravel.dev in the browser's address bar.

  • Save the file.
  • Open the xampp Apache httpd-vhosts.conf file.
  • At the bottom of the file, add this: (I am assuming xampp is installed at the root of the D: drive)

    <VirtualHost *:80>
      ServerName laravel.dev
      DocumentRoot "D:/xampp/htdocs/laravel/public"
      <Directory "D:/xampp/htdocs/laravel/public">
      </Directory>
    </VirtualHost>
    
  • Add an htaccess file to your laravel/public folder (if its not already there). I think the default htaccess file that comes with L4 looks like this:

    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    
  • Restart your xampp apache server.
  • Open a web browser and type in the address bar - http://laravel.dev
  • That will take you to the index.php file in the "public" folder.
  • To get to the About page, I think the address would be http://laravel.dev/about


回答3:

Move the contents of the /public folder down a level.

You'll need to update the include lines in index.php to point to the correct location. (if it's down a level, remove the '../').



回答4:

BEST Approch: I will not recommend removing public, instead on local computer create a virtual host point to public directory and on remote hosting change public to public_html and point your domain to this directory. Reason, your whole laravel code will be secure because its one level down to your public directory :)

METHOD 1: I just rename server.php to index.php and it works

METHOD 2:

Here is my Directory Structure,

/laravel/
... app
... bootstrap
... public
... etc

Follow these easy steps

  1. move all files from public directory to root /laravel/
  2. now, no need of public directory, so optionally you can remove it now
  3. now open index.php and make following replacements

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

to

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

and

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

to

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

  1. now open bootstrap/paths.php and change public directory path:

'public' => DIR.'/../public',

to

'public' => DIR.'/..',

and that's it, now try http:// localhost/laravel/



回答5:

Set you document root for apache to the public folder, and not the laravel folder. This is the simplest technique and recommended for production environments.



回答6:

I'm using L5, This works for me fine:

  1. Rename the server.php in the your Laravel root folder to index.php
  2. copy the .htaccess file from /public directory to your Laravel root folder.

-- Thatz it!!!



回答7:

I've been struggling with this problem too but i've found a simple solution that only requires you to create another .htaccess at the root of your application.

The .htaccess itself should contain this:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^{yoursite}.{extension} [NC]
RewriteRule (.*) http://www.{yoursite}.{extension}/$1 [R=301,L]

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

The complete system keeps working but it redirects to the /public folder.

This is how I solved the problem for myself.

Hope it helps!

Cheers.



回答8:

Add following code to htaccess file. It may helps you.

<IfModule mod_rewrite.c>
RewriteEngine On

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


回答9:

Add following code in your .htaccess (if not exist create a .htaccess on laravel root directory)

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

Source : http://tutsnare.com/remove-public-from-url-laravel/

at Source you also get another method to do same.

Update : Preferred way to do it is make change in directory structure which explain in source URL.



回答10:

just in simple step i did in laravel 5 make .htaccess like this in laravel folder

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

    RewriteEngine On
    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ ./index.php [L]
</IfModule>

then rename your server.php to index.php

that it it will work

or if you just doing local development

run this comman php artisan serve

it will start local server at localhost:8000 (port may vary)



回答11:

You can use symlinks or edit the httpd.conf file.

Check my answer to another similar question. I hope that it helps.



回答12:

If you don't wish to go through the stress of configuring .htaccess file, you could use PHP Built-in Server by doing this:

  1. From your command utility, cd into laravel\public
  2. The run: php -S localhost:8000

After you can access your website by going to:

http:://localhost:8000

works without appending public

See the official manual to learn more: http://php.net/manual/en/features.commandline.webserver.php



回答13:

Go to project folder using cmd and type "php artisan serve". Now navigate to: localhost:8000



回答14:

I have found geart flow to work with laravel localy.

What you can do is to configure xampp a bit. At your xamp's httpd.conf file you have to find document DocumentRoot and <Directory>. Change root directory to yours laravel public folder and restart apache. Since when you can access your project simplly just typing localhost. Now if you want you can change your host file and rewrite local dns, for example: 127.0.0.1 example.laravel.com and now you can access your project with real url. It may look bit complicated, but it's not.

Alternative to that would be php artisan serve. You can start server on different ports and when re-write hosts file.

You could add some features to improve your workflow even more, for example vagrant or ngrok. You can share your project for live presentation (speed may be issue here).



回答15:

Need to remove public segment in the larvel4 app

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 my suggession



回答16:

You need to do following things:

  1. first copy all the contents of the public directory in your root directory i.e. bring the contents of public folder 1 step up.

  2. modify the contents of index.php

From =>

require __DIR__ . "/../bootstrap/autoload";
$app = require_once __DIR__ . "/../boostrap/start.php"

To =>

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

and also contents of bootstrap/paths.php

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

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

3.Then finally create .htaccess file in your root directory and write this.

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    RewriteEngine On
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>


回答17:

Simple Steps To follow:

  1. Rename server.php (In Root directory) to index.php
  2. Copy .htaccess file from public directory to root directory


回答18:

rename the server.php to index.php and copy .htaccess from /public is the right way. If you send your app online,just change DocumentRoot to the path of public.



回答19:

if you remove public from url first of all move index.php and .htaccess file from public folder to root of the laravel and change in index.php file

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

to

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

and run the program



回答20:

This has been asked before many times. I had the same problem. I solved it by using vhosts and .htaccess files. I wanted to write about solution on both XAMPP on Windows and LAMP installation on Ubuntu. My configuration on windows: My aim was to reach my application by entering the uri below

http://localhost/subdir

c:\xampp\htdocs\subdir\ # this was laravel root directory
c:\xampp\apache\conf\extra\httpd-vhosts.conf # this virtual hosts file

I used original .htaccess file from Laravel website (and remember .htaccess file must be in public directory) but I just added one line which is

RewriteBase /subdir (just below RewriteEngine On)

In addition, in httpd-vhosts file you should add your subdirectory alias like that:

Alias /subdir
"C:/xampp/htdocs/subdir/public"
<Directory "C:/xampp/htdocs/subdir/public">
  Order allow,deny
  Allow from all
  Options All
  AllowOverride All
  Require all granted
</Directory>

Hope everything is clear with my explanation. This answer can be applied on unix based systems easily.