前言

在学习了一段时间 Larvel 后,写了个生成短网址小应用,把应用部署到服务器上的时候就出现了问题…..

以此文祭奠我失去的青春…

正文

在服务器上配置完成后,打开浏览器访问域名,返回该地址无法响应请求,什么错误信息都没有。于是建了一个 PHP 文件,访问后正常运行,说明环境是没问题的。经过搜索,有人说要给 storage 权限,执行命令:

1
sudo chmod -R 777 storage/

还是不能运行,又看到文章说先要让 PHP 显示错误信息。首先要找到你的 php.ini 文件,可以通过 whereis php.ini 来进行搜索,我的路径是 /usr/local/php/etc/php.ini,然后将 display_errors = Off 改成 On。

1
2
cd /usr/local/php/etc
vim php.ini

保存以后重启 Nginx 服务:

1
service nginx restart

刷新页面就可以看到报错信息:

1
2
3
4
5
Warning: require(): open_basedir restriction in effect. File(/home/www/ShortUrl/bootstrap/autoload.php) is not within the allowed path(s): (/home/www/ShortUrl/public/:/tmp/:/proc/) in /home/www/ShortUrl/public/index.php on line 22

Warning: require(/home/www/ShortUrl/bootstrap/autoload.php): failed to open stream: Operation not permitted in /home/www/ShortUrl/public/index.php on line 22

Fatal error: require(): Failed opening required '/home/www/ShortUrl/public/../bootstrap/autoload.php' (include_path='.:/usr/local/php/lib/php') in /home/www/ShortUrl/public/index.php on line 22

open_basedir 可以将用户访问文件的活动范围限制在指定的区域,而上面的错误的意思就是 /home/www/ShortUrl/bootstrap/autoload.php 不在允许的路径:/home/www/ShortUrl/public/:/tmp/:/proc/里面。

因为 Laravel 入口文件在 public 目录下面,所以默认访问文件的活动范围只能在 public 目录。但是 Laravel 的代码目录都与 public 同级,也就是在 public 外面,当 index.php 请求代码目录的时候,就会抛出异常。

解决办法就是设置 open_basedir 的值,改变用户访问文件的活动范围。依旧是打开 php.ini 文件,在文件末尾加上一下内容:

1
2
3
4
[HOST=url.hxhsoft.cn]
open_basedir=/home/www/ShortUrl/:/tmp/
[PATH=/home/www/ShortUrl/public]
open_basedir=/home/www/ShortUrl/:/tmp/

HOST 就是 Laravel 应用的域名,PATH 就是应用的入口目录。刷新页面,Laravel 就可以正常运行了。

围观我的小应用:http://url.hxhsoft.cn

这是一篇过去很久的文章,其中的信息可能已经有所发展或是发生改变。