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

问题描述 投票:35回答:10

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

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

php apache2 laravel-5 cpanel
10个回答
56
投票

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

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

0
投票
  1. index.php: 加 bootstrap/app.php 之后 $app->bind('path.public', function() { return __DIR__; });
  2. 修复$app = new Illuminate\Foundation\Application( realpath(__DIR__) ); : 更改 server.phpif ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { return false; } require_once __DIR__.'/public/index.php';
  3. if ($uri !== '/' && file_exists(__DIR__.'/public_html'.$uri)) { return false; } require_once __DIR__.'/public_html/index.php'; ,改变 .gitignore/public/hot /public/storage
  4. /public_html/hot /public_html/storage ,改变 webpack.mix.jsmix.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'); 函数的修复程序,它仍然存在...


19
投票

如果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';
    });
}

4
投票

服务器

主题中描述的方法工作得很好,因此修改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 <[email protected]>
 */

$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值的相对路径。

快乐的编码。


3
投票

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

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

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

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

步骤3A:

原创 - > qazxsw poi

变化 - > require __DIR__.'/../vendor/autoload.php';

原创 - > require __DIR__.'/../**created_folder**/vendor/autoload.php';

变化 - > $app = require_once __DIR__.'/../bootstrap/app.php';

第4步:创建symlinkcreate.php

步骤4A:$app = require_once __DIR__.'/../**Created_folder**/bootstrap/app.php';

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

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

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

<?php 
symlink('/home/**server_directory**/**created_folder**/storage/app/public','/home/**server_directory**/public_html/storage');

完。

对于Laravel 5.5 public_html问题,您可以安静地使用此答案。


2
投票

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

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

1
投票

这不像绑定那么容易。最简洁,更精心的答案由ferrolho在这里提供$this->app->bind('path.public', function() { return realpath(base_path().'/../public_html'); });

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


1
投票

大家好,它适合我...你可以使用它

去这个地址:

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

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

/app/Providers/AppServiceProvider.php

0
投票

对于那些需要更改公共路径以便Artisan也可以使用的人,可以在public function register() { $this->app->bind('path.public', function() { return realpath(base_path().'/../public_html'); }); } 上添加以下内容,就在最后一个bootstrap/app.php方法之后:

singleton

0
投票

对我来说,除非我在服务器设置中更改了根公用文件夹,否则这一切都无效。在生产中它在$app->bind('path.public', function () { return base_path("<your public directory name>"); }); 。使用文本编辑器编辑它,然后滚动直到看到指向/etc/nginx/sites-enabled/<your_site_name>文件夹的根路径。将其更改为您的新公用文件夹,然后重新启动服务器。在本地,我必须改变/publicHomestead.yaml的路径,在我连接到Vagrant之后。 /etc/nginx/sites-enabled/<your_site_name>确保它流行起来。然后我还编辑了vagrant reload --provision并在服务提供商中注册了一条新路径,以防万一,但似乎没有它。我没有使用Laravel的任何第三方依赖,所以我不知道这是否适用于那种情况。

© www.soinside.com 2019 - 2024. All rights reserved.