问题
I'm using a shared hosting which uses cPanel as its control panel and within the cPanel public_html
is the default root directory, because of this I can't get my Laravel application work properly.
Is there any way to make Laravel use public_html
instead of public folder?
回答1:
Quite easy to find this with a simple search.
See: https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5
In your index.php add the following 3 lines.
/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/
$app = require_once __DIR__.'/../bootstrap/app.php';
// set the public path to this directory
$app->bind('path.public', function() {
return __DIR__;
});
Edit:
As Burak Erdem mentioned, another option (and more preferable) is to put this in the \App\Providers\AppServiceProvider
register()
method.
/**
* Register any application services.
*
* @return void
*/
public function register()
{
// ...
$this->app->bind('path.public', function() {
return base_path('public_html');
});
}
回答2:
If Robert's index.php
solution is not working for you, you can also register the following code at Application Service Provider (App\Providers\AppServiceProvider.php)
.
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
public function register()
{
$this->app->bind('path.public', function() {
return base_path().'/public_http';
});
}
回答3:
Server
Methods described in topic are working just fine, so modyfing App\Providers\AppServiceProvider.php register method should do the job:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
public function register()
{
$this->app->bind('path.public', function() {
return base_path() . '/public_http';
});
}
Local php artisan serve development
However, there is one more issue you can experience. If you're developing your app on local machine and you're using php artisan serve
command to serve your app you're going to break it with above syntax only. You still need to adjust server.php file which exists in main directory. Edit the contents of it and replace each occurance of /public
to /public_html
, so it looks like this:
<?php
/**
* Laravel - A PHP Framework For Web Artisans
*
* @package Laravel
* @author Taylor Otwell <taylor@laravel.com>
*/
$uri = urldecode(
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);
// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' && file_exists(__DIR__.'/public_html'.$uri)) {
return false;
}
require_once __DIR__.'/public_html/index.php';
After that. Just stop your server and reload it with php artisan serve
.
Front end laravel-mix development
If you're using webpack and laravel-mix to generate your css and js files then this also needs some update. Without tweaking webpack.mix.js you will end up with something like this on npm run watch
or npm run production
:
.
..
public
_html
js
public_html
css
public_html
So it's going to mess up your code. To clarify this you have to provide a public path to your webpack.mix.js file. It could look like this:
const mix = require('laravel-mix');
mix.setPublicPath('public_html/');
mix.js('resources/js/app.js', 'js')
mix.sass('resources/sass/app.scss', 'css');
This is going to change the default definition of public directory from public
to public_html
and next lines provides a relative path to your setPublicPath value.
Happy coding.
回答4:
These answers did not work for laravel 5.5, but my own method can help you.
Step 1: Discard all files except the public file to the main directory on the server.
Step 2: Public file to the public_html file on the server.
Step 3: Pull index.php file from public_html and change it like this.
Step 3A:
Orginal -> require __DIR__.'/../vendor/autoload.php';
Changes -> require __DIR__.'/../**created_folder**/vendor/autoload.php';
Original -> $app = require_once __DIR__.'/../bootstrap/app.php';
Changes -> $app = require_once __DIR__.'/../**Created_folder**/bootstrap/app.php';
Step 4: Create symlinkcreate.php
Step 4A: <?php
symlink('/home/**server_directory**/**created_folder**/storage/app/public','/home/**server_directory**/public_html/storage');
Step 4B: yourwebsite.com/symlinkcreate.php visit
Step 4C: symlinkcreate.php delete your server.
Finally, the directory structure looks like this:
/etc
/logs
/lscache
/mail
/Your_Created_Folder
../LARAVEL_FOLDERS
/public_html
../css
../js
../.htaccess
../index.php
../web.config
/ssl
/tmp
Finish.
Laravel 5.5 public_html sorunu için bu cevabı gönül rahatlığıyla kullanabilirsiniz.
回答5:
Just want to update all previous answers, if your public_html is not inside laravel folder, then you need to use this code:
$this->app->bind('path.public', function() {
return realpath(base_path().'/../public_html');
});
回答6:
hi guys it works for me ... you can use it
go to this address :
/app/Providers/AppServiceProvider.php
and append this code to end of file ....
public function register()
{ $this->app->bind('path.public', function() {
return realpath(base_path().'/../public_html');
});
}
回答7:
It's not so easy like binding. The cleanest and more elaborated answer is provided by ferrolho here https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5
But the fastest answer is creating a symbolic link named public pointing to public_html and put your index.php in the last one.
回答8:
In
bootstrap/app.php
:Add
$app->bind('path.public', function() { return __DIR__; });
right after
$app = new Illuminate\Foundation\Application( realpath(__DIR__) );
Fixing
server.php
:Change
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { return false; } require_once __DIR__.'/public/index.php';
to
if ($uri !== '/' && file_exists(__DIR__.'/public_html'.$uri)) { return false; } require_once __DIR__.'/public_html/index.php';
In
.gitignore
, change/public/hot /public/storage
to
/public_html/hot /public_html/storage
In
webpack.mix.js
, changemix.js('resources/js/app.js', 'public/js') .sass('resources/sass/app.scss', 'public/css');
to
mix.js('resources/js/app.js', 'public_html/js') .sass('resources/sass/app.scss', 'public_html/css');
I'm still looking for a fix for the asset()
function, which remains broken...
回答9:
For those that need to change the public path so that it is also available to Artisan, add the following to bootstrap/app.php
, just after the last singleton
method:
$app->bind('path.public', function () {
return base_path("<your public directory name>");
});
回答10:
For me none of this worked until I changed the root public folder in server settings. In production it is in /etc/nginx/sites-enabled/<your_site_name>
. Edit it with a text editor and just scroll until you see root path pointing to /public
folder. Change that to whatever is your new public folder and restart the server. On local, I had to change path in Homestead.yaml
and /etc/nginx/sites-enabled/<your_site_name>
after I SSHed into Vagrant. vagrant reload --provision
to make sure it caught on. Then I also edited index.php
and registered a new path in the service provider just in case, but it seems to work without it. I don't use any 3rd party dependencies with Laravel though so I don't know if this will work in that case.
来源:https://stackoverflow.com/questions/30198669/how-to-change-public-folder-to-public-html-in-laravel-5