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

How to make public folder as root in Laravel?

提问人:Martin AJ 提问时间:11/23/2016 最后编辑:miken32Martin AJ 更新时间:10/3/2023 访问量:39297

问:

我正在使用 Laravel 框架创建一个 Web 应用程序。Laravel 应用程序可以从应用程序的目录中访问。index.phppublic

首页路由定义为:

Route::get('/', 'HomeController@index');

但我只能从 URL 访问它。https://example.com/public

如何将文件夹设为 root?/public


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

PHP 拉维尔

评论

0赞 Jan Willem 11/23/2016
FTP 上的目录结构是什么?像这样的东西 ?domains/domain.com/public_html
1赞 Nico Haase 3/3/2021
请分享更多详细信息 - 为什么不将文档根目录设置为该目录?

答:

9赞 Alexey Mezenin 11/23/2016 #1

不要修改任何 Laravel 文件。相反,将您的 Web 服务器(Apache 或 Nginx)配置为指向 Laravel 项目的公共目录

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

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

对于 nginx,您应该更改以下行:

root /path_to_laravel_project/public;

单独使用文档根目录将造成严重的安全风险,可能会将整个应用程序配置开放到 Internet。/path_to_laravel_project/

评论

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

步骤1:将/public/index.php/public/htaccess文件作为/index.php和/htaccess放入根目录。
第 2 步:现在在索引 .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';

评论

0赞 miken32 10/16/2023
恭喜,现在每个人都可以访问您的文件.env
1赞 DragonFire 3/3/2021 #3

要在 Ubuntu 上运行 Apache,请执行以下操作。这假设您已经安装了 Composer 和 PHP。

# create your web directory
sudo mkdir -p /var/www/example.com
# install laravel
cd /var/www/example.com
composer create-project laravel/laravel example-app
# proper ownership
sudo chown -R www-data:www-data /var/www/example.com
# create a configuration
sudo nano /etc/apache2/sites-available/example.com.conf

然后在文件中粘贴

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    # SSL configuration, etc.
</VirtualHost>

然后运行

# enable your site
sudo a2ensite <your domain>
# disable the default site
sudo a2dissite 000-default
# restart the web server
sudo systemctl reload apache2

评论

0赞 miken32 10/16/2023
您的权限非常广泛。Web 服务器不能对配置或代码等内容具有写入权限,只有目录需要写入 www-data。storage
-1赞 Shyam Shankar Yadav 10/3/2023 #4

当 url 命中 domain/public thet reditect 301 时,可以使用 RewriteRule ^public(/.*)?$ / [R=301,L]

RewriteEngine 开启
# Redirect requests to /public to the root URL
RewriteRule ^public(/.*)?$ / [R=301,L]

# Rewrite all other requests to the public folder
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ public/$1 [L]
1赞 rozsazoltan 12/16/2023 #5

域的文档根目录

域名应指向文件夹,就好像它是您的文件夹一样。/publicpublic_html

每当向此域发出请求时,都应执行index.php

您需要在包含您提到的行的文件夹中放置一个文件,尤其是这些行:.htaccess/public

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

由于 Laravel 路由,返回适当的内容

这样,在域名下调用的每个 URL 都将从 您的 开始,从而构建您的 Laravel 应用程序。最终,它将运行 中定义的相应路由,或者如果未找到匹配的路由,则返回 404 空白页。/public/index.php/routes

结论

如果您的域名指向 your-project 而不是 ,则 将显示在 URL 中。因此,您可以访问以 ./publicyour-project/publicindex.phphttps://example.com/public/index.php

# normal directory tree
server
├── your-project
│   ├── app
│   ├── routes
│   ├── public        <--- domain root
│   │   ├── index.php
│   │   └── .htaccess
│   ├── ...

如果域的根目录指向该文件夹,并且您仍然可以使用该地址访问其内容,则说明您在文件中错误地设置了路由(可能创建了一个名为“public”的组或将 URL 部分添加到每个路由),或者您的域错误地指向该文件夹。/your-project/public/public/routes/web.php/public/your-project

额外:如果无法更改域的根目录

您可能无法控制域名指向哪个目录,例如,它可能被固定为“public_html”目录。没问题。

将目录的内容放在此处。然后,在与 相同的级别上放置目录。之后,使用 修改该指向上一级目录的所有引用。相反,请将其替换为 ./your-project/publicpublic_htmlyour-project/your-project/public/index.php../../your-project

例:

# changed directory tree (when has fixed domain's root)
server
├── your-project
│   ├── app
│   ├── routes
│   └── ...
├── public_html     <--- domain root
│   ├── index.php
│   └── .htaccess
<?php
// your-project/public/index.php --> public_html/index.php

use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

// ../your-project/ instead of ../
if (file_exists($maintenance = __DIR__.'/../your-project/storage/framework/maintenance.php')) {
    require $maintenance;
}

// ../your-project/ instead of ../
require __DIR__.'/../your-project/vendor/autoload.php';

// ../your-project/ instead of ../
$app = require_once __DIR__.'/../your-project/bootstrap/app.php';

$kernel = $app->make(Kernel::class);

$response = $kernel->handle(
    $request = Request::capture()
)->send();

$kernel->terminate($request, $response);