提问人:Martin AJ 提问时间:11/23/2016 最后编辑:miken32Martin AJ 更新时间:10/3/2023 访问量:39297
如何在Laravel中将公共文件夹设为root?
How to make public folder as root in Laravel?
问:
我正在使用 Laravel 框架创建一个 Web 应用程序。Laravel 应用程序可以从应用程序的目录中访问。index.php
public
首页路由定义为:
Route::get('/', 'HomeController@index');
但我只能从 URL 访问它。https://example.com/public
如何将文件夹设为 root?/public
目前,我找到了一种解决方法。我可以在根目录上创建一个并将重定向代码写入文件夹。因此,当用户输入时,它将被自动重定向到。但这仍然是丑陋的。我不喜欢在 URL 中看到。有什么建议吗?index.php
/public
http://example.com/
http://example.com/public
/public
答:
不要修改任何 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/
评论
.htaccess
/config
步骤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';
评论
.env
要在 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
评论
storage
当 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]
域的文档根目录
域名应指向文件夹,就好像它是您的文件夹一样。/public
public_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 中。因此,您可以访问以 ./public
your-project/public
index.php
https://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/public
public_html
your-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);
评论
domains/domain.com/public_html