如何将 public 文件夹更改为 laravel 5 中的 public_html

How to change public folder to public_html in laravel 5

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

有没有办法让 Laravel 使用 public_html 而不是 public 文件夹?

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

参见: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');
    });
}

如果罗伯特的 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';
    });
}

对于那些需要更改 public 路径以便 Artisan 也可用的人,将以下内容添加到 bootstrap/app.php,就在最后一个 singleton 方法之后:

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

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

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

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

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

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

这些答案不适用于 laravel 5.5,但我自己的方法可以帮助您。

第 1 步:丢弃除 public 文件之外的所有文件到服务器上的主目录。

第 2 步:Public 文件到服务器上的 public_html 文件。

第 3 步:从 public_html 中提取 index.php 文件并像这样更改它。

步骤 3A:

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

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

原始 -> $app = require_once __DIR__.'/../bootstrap/app.php';

更改 -> $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:您的网站。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_html sorunu için bu cevabı gönül rahatlığıyla kullanabilirsiniz.

转到此地址:

/app/Providers/AppServiceProvider.php

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

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

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

  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() 功能的修复程序,该功能仍然损坏...

服务器

主题中描述的方法工作得很好,所以 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';
    });
}

本地phpartisan服务发展

但是,您可能会遇到另外一个问题。如果您在本地机器上开发您的应用程序并且您正在使用 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

所以它会弄乱你的代码。为澄清这一点,您必须提供 public 文件的 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 更改为 public_html,下一行提供了您的 setPublicPath 值的相对路径。

编码愉快。

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

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

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

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

我花了两天时间才搞清楚,但最后我通过执行后续步骤将 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 目录的备份。如果您的主机和编辑的 .env 文件上有正确的 PHP 版本,那么一切都应该正常工作。

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

和public_html(原来是public目录)看起来是这样的:

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