如何在 Laravel 中将公用文件夹设为 root?

Posted

技术标签:

【中文标题】如何在 Laravel 中将公用文件夹设为 root?【英文标题】:How to make public folder as root in Laravel? 【发布时间】:2017-04-07 00:03:19 【问题描述】:

我使用 Laravel 框架。如您所知,它的目录如下所示:

要打开我网站的主页 (Route::get('/', 'HomeController@index');),我需要打开目录的 /public 文件夹。换句话说,要查看我网站的第一页,这里是 URL:

http://example.com/public

无论如何,只有我的域名 (http://example.com/) 不是我的根。如何将/public 文件夹设为root?


目前我找到了一种解决方法。我可以在根目录上创建一个index.php 并将重定向代码写入/public 文件夹。所以当用户输入http://example.com/时,它会自动重定向到http://example.com/public。但这仍然很丑陋。我不喜欢在 URL 中看到 /public。有什么建议吗?

【问题讨论】:

Laravel 5 - Remove public from URL的可能重复 您的 FTP 上的目录结构是什么? domains/domain.com/public_html 之类的东西? 请分享更多详细信息 - 为什么不将文档根目录设置为该目录? 【参考方案1】:

对于Ubuntu 20.04,对虚拟主机执行以下操作。同样在等待几分钟后,清除浏览器缓存并重新加载。

sudo mkdir /var/www/<your domain>/public
sudo chown -R $USER:$USER /var/www/<your domain>
sudo nano /etc/apache2/sites-available/<your domain>.conf

然后在文件中粘贴

<VirtualHost *:80>
    ServerName <your domain>
    ServerAlias www.<your domain>
    ServerAdmin <your email address>
    DocumentRoot /var/www/<your domain>/public
    ErrorLog $APACHE_LOG_DIR/error.log
    CustomLog $APACHE_LOG_DIR/access.log combined
</VirtualHost>

然后运行

sudo a2ensite <your domain>
sudo a2dissite 000-default
sudo systemctl reload apache2

nano /var/www/<your domain>/public/index.html

然后粘贴到文件中

<html>
  <head>
    <title><your domain></title>
  </head>
  <body>
    <center>
        <p>Site Under Maintenance</p>
    </center>
  </body>
</html>

【讨论】:

【参考方案2】:

第 1 步:将您的 /public/index.php/public/htaccess 文件作为 /index.php 放入您的根目录和 /htaccess 。 第 2 步:现在对 index.php 进行更改

require __DIR__.'/../bootstrap/autoload.php'; //OLD code
$app = require_once __DIR__.'/../bootstrap/app.php';

 require __DIR__.'./bootstrap/autoload.php'; //NEW code
 $app = require_once __DIR__.'./bootstrap/app.php';

【讨论】:

【参考方案3】:

有很多方法可以做到这一点。

你只需要从public目录中剪切index.php和.htaccess并粘贴到根目录中,将index.php中的两行替换为

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';

最好的方法是.htaccess。在 Laravel 安装的根目录下创建 .htaccess 文件。下面的代码将适用于此。

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

您可以从这里阅读:WAY TO DO

【讨论】:

我应该把这两行写在根目录下的index.php文件中吗? @MartinAJ 你有没有从公共目录中剪切 index.php 和 .htaccess 并将其粘贴到 laravel 的根目录中? 啊...还没有,让我测试一下 粘贴根目录后编辑index.php,替换两行index.php,应该可以了。 我做到了,是的,它有效.. +1 .. 只是因为更改了主目录,我网站中的所有路径都已损坏:-(【参考方案4】:

不要修改任何 Laravel 文件。使用网络服务器(Apache 或 nginx)指向Laravel project to public directory。

对于 Apache,您可以使用以下指令:

DocumentRoot "/path_to_laravel_project/public"
<Directory "/path_to_laravel_project/public">

对于 nginx,你应该改变这一行:

root /path_to_laravel_project/public;

【讨论】:

我应该在根目录下的.htaccess 文件中写这两行(我使用Apache)吗? @MartinAJ 通常你把它放在主配置文件或虚拟主机配置中。 好吧,根目录上有一个/config 文件夹。所以?我应该在其中创建任何文件吗? 无论如何我想这个解决方案是最好的,但老实说我无法实现它。我使用 cPanel 网络服务,我真的不知道我应该在哪里粘贴您的代码。 在我看来,这个答案是最好的。这将使您的文件保持在 /public 文件夹上方的安全。正如 Laravel 的意图一样。在将应用程序/网站转移到不允许您编辑虚拟主机的托管服务时,这可能会更加困难甚至不可能。因此,请确保您选择允许您编辑虚拟主机文件的托管服务提供商。或者自己托管:)

以上是关于如何在 Laravel 中将公用文件夹设为 root?的主要内容,如果未能解决你的问题,请参考以下文章

避开 laravel 的公用文件夹,直接在 web 服务器中打开根目录

Laravel:如何在 Laravel 中找到公用文件夹?

在 Laravel 中,如何获取公用文件夹中所有文件的列表?

Laravel5 如何从控制器访问公用文件夹

如何从 Laravel 的公用文件夹中调用模型?

如何将 laravel 项目指向共享主机中 public_html 下的公用文件夹