前言
相信很多朋友想到把自己的laravel项目放在虚拟主机上运行, 可是, 有一个硬伤就是, laravel 的入口文件在 public 目录下, 而很多虚拟主机是不支持自定义项目根目录的, 这个时候要怎么解决呢???
分析原因
- 虚拟主机运营商的角度: 虚拟主机为了最大化限制用户的使用, 只开放一个根目录放一个网站程序, 若想使用更多, 只能另行购买, 以达到赚钱减负的目的
- laravel 的设计思想: 为了程序能够更加安全, 将项目的核心文件跟用户访问的根目录隔离开来, 对外暴露的只有 public 目录, 从而做到了安全跟优化
综合这两种来看, 站在谁的角度, 都无可厚非, 而作为被强奸的用户, 我们当然也不能坐以待毙, 下边便是我试验过的解决方案:
解决方案
既然是入口限制了程序, 那么, 我们就解决入口问题:
- 分析laravel 入口文件的源码如下(去除了注释):
<?php
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
这一看源码就开心了, 是不是发现, 根本没有实质性的依赖, 只有简单的引入和基本服务启动操作, 既然是基本操作, 我想在哪里操作是不是都一样呢?
于是乎, 我就对他做了一个操作, 将入口文件 index.php
从
/path/to/laravel/public/index.php
搬运到了
/path/to/laravel/index.php
这里的
/path/to/laravel
是指你的项目实际路径, 比如: linux 下的目录, 大多在/usr/local/www
下
因为目录变了, 相应的引入路径也要做相应变化, 修改后如下:
<?php
require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
也就是将引入的绝对路径bootstrap
目录从相对的上级目录, 改为当前目录, 下面我们就可以愉快的访问了
是不是很简单呢, 同样的, 我们可以做出变通, 可以将入口文件放到任何你想要放的位置, 只要保证引入的目录是对的, 就可以了
注意事项
- 这样做无疑有点背离了laravel的入口设计初衷, 不过, 为了生产, 还是要懂得变通一下
- 当你移动了入口文件, 那么, 相应的静态文件(如: js, css, img)就要做相应调整, 要么移动到新的根目录, 要么在路径上要做出相应调整, 最好的办法就是定义一个变量来解决目录依赖问题
网友评论