如何在laravel 5中将公用文件夹更改为public_html

时间:2015-05-12 18:22:50

标签: php apache2 laravel-5 cpanel

我正在使用一个共享主机,它使用cPanel作为其控制面板,在cPanel public_html内是默认的根目录,因此我无法使我的Laravel应用程序正常工作。

有没有办法让Laravel使用public_html代替公用文件夹?

13 个答案:

答案 0 :(得分:51)

通过简单的搜索很容易找到它。

请参阅:https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5

在index.php中添加以下3行。

/*
|--------------------------------------------------------------------------
| 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__;
});

编辑:

正如Burak Erdem所提到的,另一种选择(更可取的选择)是将其置于\App\Providers\AppServiceProvider register()方法中。

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    // ...

    $this->app->bind('path.public', function() {
        return base_path('public_html');
    });
}

答案 1 :(得分:18)

如果Robert的index.php解决方案不适合您,您还可以在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';
    });
}

答案 2 :(得分:3)

这些答案对于laravel 5.5不起作用,但我自己的方法可以帮助你。

步骤1:将除公共文件以外的所有文件丢弃到服务器上的主目录。

步骤2:公共文件到服务器上的public_html文件。

步骤3:从public_html中提取index.php文件并将其更改为。

步骤3A:

原始 - &gt; require __DIR__.'/../vendor/autoload.php';

更改 - &gt; require __DIR__.'/../**created_folder**/vendor/autoload.php';

原创 - &gt; $app = require_once __DIR__.'/../bootstrap/app.php';

更改 - &gt; $app = require_once __DIR__.'/../**Created_folder**/bootstrap/app.php';

步骤4:创建symlinkcreate.php

步骤4A:<?php symlink('/home/**server_directory**/**created_folder**/storage/app/public','/home/**server_directory**/public_html/storage');

步骤4B:yourwebsite.com/symlinkcreate.php访问

步骤4C:symlinkcreate.php删除你的服务器。

最后,目录结构如下所示:

/etc
/logs
/lscache
/mail
/Your_Created_Folder
  ../LARAVEL_FOLDERS
/public_html
  ../css
  ../js
  ../.htaccess
  ../index.php
  ../web.config
/ssl
/tmp

完成。

Laravel 5.5 public_htmlsorunuiçinbucevabıgönülalhatlığıylakullanabilirsiniz。

答案 3 :(得分:3)

服务器

本主题中描述的方法可以正常工作,因此modyfing 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';
    });
}

本地php工匠服务开发

但是,您还会遇到另外一个问题。如果您正在本地计算机上开发应用程序,并且正在使用php artisan serve命令来为您的应用程序提供服务,那么您只会使用上述语法来破坏它。您仍然需要调整主目录中存在的server.php文件。编辑其中的内容,并将每次出现的/public替换为/public_html,看起来像这样:

<?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';

之后。只需停止服务器并用php artisan serve重新加载它即可。

前端laravel-mix开发

如果您正在使用webpack和laravel-mix生成您的css和js文件,那么这还需要一些更新。无需调整webpack.mix.js,您最终会在npm run watchnpm run production上看到类似的内容:

.
..
public
  _html
    js
  public_html
    css
public_html

因此,它将弄乱您的代码。为了澄清这一点,您必须提供webpack.mix.js文件的公共路径。看起来可能像这样:

const mix = require('laravel-mix');

mix.setPublicPath('public_html/');
mix.js('resources/js/app.js', 'js')
mix.sass('resources/sass/app.scss', 'css');

这将把公共目录的默认定义从public更改为public_html,接下来的几行提供了setPublicPath值的相对路径。

快乐的编码。

答案 4 :(得分:1)

这不像绑定那么容易。 ferrolho在https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5

提供了最清晰,更详尽的答案

但最快的答案是创建一个名为public的符号链接指向public_html并将index.php放在最后一个中。

答案 5 :(得分:1)

只想更新以前的所有答案,如果你的public_html不在laravel文件夹中,那么你需要使用这段代码:

$this->app->bind('path.public', function() {
   return realpath(base_path().'/../public_html');
});

答案 6 :(得分:0)

对于那些需要更改公共路径以便Artisan也可以使用的人,请在bootstrap/app.php之后添加以下singleton方法:

$app->bind('path.public', function () {
    return base_path("<your public directory name>");
});

答案 7 :(得分:0)

大家好,它对我有用......你可以用它

转到这个地址:

/app/Providers/AppServiceProvider.php

并将此代码附加到文件末尾....

public function register()
{   $this->app->bind('path.public', function() {
    return realpath(base_path().'/../public_html');
  });
}

答案 8 :(得分:0)

对我来说,这一切都不起作用,除非我在服务器设置中更改了根公用文件夹。在生产中,它在/etc/nginx/sites-enabled/<your_site_name>中。使用文本编辑器对其进行编辑,然后滚动直到看到指向/public文件夹的根路径。将其更改为新的公用文件夹,然后重新启动服务器。在本地上,我在SSH进入Vagrant后必须更改Homestead.yaml/etc/nginx/sites-enabled/<your_site_name>中的路径。 vagrant reload --provision,以确保它流行起来。然后,我还编辑了index.php并在服务提供者中注册了一个新路径,以防万一,但是如果没有它,它似乎可以工作。不过,我没有在Laravel中使用任何第三方的依赖关系,所以我不知道在这种情况下这是否行得通。

答案 9 :(得分:0)

  1. bootstrap/app.php中:

    添加

    $app->bind('path.public', function() {
      return __DIR__;
    });
    

    紧接着

    $app = new Illuminate\Foundation\Application(
      realpath(__DIR__)
    );
    
  2. 修复server.php

    更改

    if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
      return false;
    }
    
    require_once __DIR__.'/public/index.php';
    

    if ($uri !== '/' && file_exists(__DIR__.'/public_html'.$uri)) {
      return false;
    }
    
    require_once __DIR__.'/public_html/index.php';
    
  3. .gitignore中,更改

    /public/hot
    /public/storage
    

    /public_html/hot
    /public_html/storage
    
  4. webpack.mix.js中,更改

    mix.js('resources/js/app.js', 'public/js')
      .sass('resources/sass/app.scss', 'public/css');
    

    mix.js('resources/js/app.js', 'public_html/js')
      .sass('resources/sass/app.scss', 'public_html/css');
    

我仍在寻找asset()函数的修复程序,该函数仍然无效...

答案 10 :(得分:0)

简单的根目录创建.htaccess文件并添加代码:

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

答案 11 :(得分:0)

对我来说,最简单的解决方案是创建符号链接。

  1. 备份public_html文件夹。
  2. 通过ssh连接到服务器。
  3. 在我的特定情况下,整个应用程序位于~/laravel文件夹中。
  4. 现在您必须位于~/文件夹中:
  5. 运行rm -r public_html。此命令将删除public_html文件夹及其所有内容。
  6. 进行符号链接ln -s $(pwd)/laravel/public $(pwd)/public_html$(pwd)将替换为从服务器根目录开始的绝对路径。
  7. 现在您应该能够看到所需的结果。

答案 12 :(得分:0)

我花了两天时间才弄明白,但最终我通过执行以下步骤将我的 Laravel 项目部署到了​​我的 cPanel 虚拟主机:

  1. 将 server.php 文件更改如下:
if ($uri !== '/' && file_exists(__DIR__ . '/public_html' .$uri)) {
    return false;
}

require_once __DIR__ . '/public_html/index.php';
  1. 将 webpack.mix.js 更改如下:
mix.js('resources/js/app.js', 'public_html/js')
    .postCss('resources/css/app.css', 'public_html/css', [
        //
    ]);
  1. 将Laravel-project中“public”文件夹的名称改为“public_html”,并将代码上传到根目录cPanel。确保您有当前 public_html 目录的备份。如果您的主机上有正确的 PHP 版本并编辑了 .env 文件,那么一切都应该正常工作。

我的 cPanel 根目录(来自文件管理器)如下所示: enter image description here

public_html(最初是公共目录)看起来像这样: enter image description here

如果您有任何问题,请随时与我联系:)