美文网首页PHP经验分享Laravel
在不支持自定义根目录的虚拟主机服务器上运行laravel

在不支持自定义根目录的虚拟主机服务器上运行laravel

作者: fizzday | 来源:发表于2016-12-06 10:46 被阅读220次

    前言

    相信很多朋友想到把自己的laravel项目放在虚拟主机上运行, 可是, 有一个硬伤就是, laravel 的入口文件在 public 目录下, 而很多虚拟主机是不支持自定义项目根目录的, 这个时候要怎么解决呢???

    分析原因

    1. 虚拟主机运营商的角度: 虚拟主机为了最大化限制用户的使用, 只开放一个根目录放一个网站程序, 若想使用更多, 只能另行购买, 以达到赚钱减负的目的
    2. laravel 的设计思想: 为了程序能够更加安全, 将项目的核心文件跟用户访问的根目录隔离开来, 对外暴露的只有 public 目录, 从而做到了安全跟优化

    综合这两种来看, 站在谁的角度, 都无可厚非, 而作为被强奸的用户, 我们当然也不能坐以待毙, 下边便是我试验过的解决方案:

    解决方案

    既然是入口限制了程序, 那么, 我们就解决入口问题:

    1. 分析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目录从相对的上级目录, 改为当前目录, 下面我们就可以愉快的访问了
    是不是很简单呢, 同样的, 我们可以做出变通, 可以将入口文件放到任何你想要放的位置, 只要保证引入的目录是对的, 就可以了

    注意事项

    1. 这样做无疑有点背离了laravel的入口设计初衷, 不过, 为了生产, 还是要懂得变通一下
    2. 当你移动了入口文件, 那么, 相应的静态文件(如: js, css, img)就要做相应调整, 要么移动到新的根目录, 要么在路径上要做出相应调整, 最好的办法就是定义一个变量来解决目录依赖问题

    相关文章

      网友评论

        本文标题:在不支持自定义根目录的虚拟主机服务器上运行laravel

        本文链接:https://www.haomeiwen.com/subject/ebtrmttx.html