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

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

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

107836 次浏览

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

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

如果 Robert 的 index.php解决方案对您不起作用,您还可以在 应用服务供应商(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_html';
});
}

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

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

它不像绑定那么容易。最干净和更详细的答案是由这里提供的铁路 https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5

但是最快的解决方案是创建一个名为 public 的符号链接,指向 public _ html,并将 index.php 放在最后一个中。

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

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

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

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

步骤2: 将公共文件发送到服务器上的 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: < code > < ? php Symlink (’/home/* * server _ directory * */* * create _ file * */Storage/app/public’,’/home/* * server _ directory * */public _ html/Storage’) ;

第四步乙: 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 _ html sorunu için bu cevab gönül rahatl yla kullanability irsiniz.

去这个地址:

/app/Providers/AppServiceProvider.php

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

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

对我来说,直到我更改了服务器设置中的根公用文件夹,这些都不起作用。在生产中是在 /etc/nginx/sites-enabled/<your_site_name>。用文本编辑器编辑它,并且只需要滚动,直到您看到指向 /public文件夹的根路径。将其更改为新的公用文件夹并重新启动服务器。在本地,我不得不改变路径在 Homestead.yaml/etc/nginx/sites-enabled/<your_site_name>后,我 SSHed 成流浪汉。vagrant reload --provision确保它流行起来。然后,我还编辑了 index.php,并在服务提供商中注册了一个新路径,以防万一,但似乎没有它也能工作。我没有使用任何与 Laravel 的第三方依赖关系,所以我不知道这是否会在这种情况下工作。

  1. bootstrap/app.php:

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

    就在那之后

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

    Change

    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. In .gitignore, change

    /public/hot
    /public/storage
    

    /public_html/hot
    /public_html/storage
    
  4. In webpack.mix.js, change

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

I'm still looking for a fix for the asset() function, which remains broken...

服务器

主题中描述的方法工作正常,因此修改 App Provider 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 artisan serve命令来服务你的应用程序,那么你只能用上面的语法来破解它。您仍然需要调整存在于 main 目录中的 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

前端混合发展

如果您使用 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更改为 public_html,下一行提供到 setPublicPath 值的相对路径。

编程愉快。

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

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

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

  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. 现在您应该能够看到期望的结果了。

我花了两天时间才弄明白,但最终我通过下面的步骤将我的 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 (最初是 public 目录)如下所示: enter image description here

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