无法在本地主机上运行Laravel 4

32

我在阅读 Laravel4 beta 发布的公告后第一次尝试 Laravel。

我按照这些步骤安装了 Composer 和 Laravel 以及所有所需的依赖项,并将 Laravel 放置在我的~/public_html目录中,就像我用 Codeigniter 时习惯的做法一样。但我认为这里有些问题。

如果我在浏览器中输入 http://localhost/~carlo/laravel-develop/ ,它只会显示目录的内容。

然后,在文件系统上我有一个laravel-develop/public文件夹,但在浏览器上没有显示出来。

我发现修改.htaccess如下:

<IfModule mod_rewrite.c> 
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L] 
</IfModule>

当我尝试访问公共文件夹时,出现了错误。

ErrorException: Warning: file_put_contents(/home/carlo/public_html/laravel-develop/app/config/../storage/meta/services.json): failed to open stream: Permission denied in /home/carlo/public_html/laravel-develop/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php line 77

另一个错误:

/home/carlo/public_html/laravel-develop/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php line 77

然后是一长串的错误信息,最后一个为:

require_once('/home/carlo/public_html/laravel-develop/start.php') in /home/carlo/public_html/laravel-develop/public/index.php line 53


如果你是初学者,建议使用Laravel 3。 - dualed
同样的问题在这里。不幸的是,这里的任何答案都没有帮助到我。我敢肯定我的权限设置正确,.htaccess 也没问题。但还是无法让它工作。 - Томица Кораћ
@dualed 那不是一个非常好的建议... 在我看来最好学习 L4,毫无疑问。 - Gadoma
1
@Gadoma 那是在一月份,当时Laravel 4还处于预测试阶段。 - dualed
14个回答

70
尝试使用终端更改存储文件夹的文件夹权限:chmod -R 777 storage。有关此问题的更多信息,请在此处查找。

2
这对我也起作用了...但是为什么我不能将存储组设置为www-data并将其权限设置为775? - gaflach
1
实际上,chmod 757 就足够了。使用 777 可能有点过头了。 - enchance
@enchance 确定吗?我刚试了 chmod 757,但不起作用。使用 chmod 777 就可以了。 - Dynelight
1
chmod -R 775 将是更安全的解决方案。在这种情况下,存储文件夹的组应该与 Web 服务器的组相同。 - eaykin
1
只有在我执行了 sudo chown -R _www:_www mywebfolder 之后,775 才对我起作用了。请参见下面的答案。 - Justin
显示剩余2条评论

16

您遇到了错误,因为laravel无法写入app/storage文件夹。其余的内容只是堆栈跟踪信息。为了使存储文件夹可写,请进入您的应用程序文件夹,然后运行:

chmod -R 777 storage

我认为这不是权限的问题,因为当我将浏览器指向http://localhost/~carlo/laravel-develop/时,public目录甚至没有出现在目录树中。我按照你的建议更改了权限,但它并没有起作用。 - Carlo
那么你可能把那个 .htaccess 文件放在了根目录,这就是为什么它没有显示公共文件夹的原因... .htaccess 应该放在公共目录中。 - girlcode
1
755不会使目录对Web服务器可写,因为您具有RWX RX RX,但每个都需要RWX,因此请使用“chmod -R 777 storage”。 - Gazzer

11

生产方式,对不熟悉Unix的人来说有一定复杂度,但更加安全:

  1. 进入超级用户模式(sudo -s或su)。
  2. 创建组webgroupadd web
  3. 将您的主要用户添加到组web中(假设您的用户是cool_user,因此运行usermod -a -G web cool_user
  4. 将php-fpm或Web服务器用户(如果php用作SAPI模块)添加到web组中(例如,在CentOS上,php-fpm使用apache用户名,因此在大多数情况下,这将起作用:usermod -a -G web apache
  5. 递归更改您的项目根目录组所有者为webchgrp -R web /path/to/project/root/
  6. 为组递归授予写权限(chmod -R g+w /path/to/project/root/
  7. 可选:为了允许您所有新创建的apache(或其他)用户文件和文件夹都可以从您的用户访问,请通过在项目根目录上递归设置相同的组ID位来使它们获得相同的组所有权(chmod -R g+s /path/to/project/root/)。

大功告成!

快速而不择手段的方式,对于那些不关心安全性而只是想以任何代价让它工作的人来说,不安全:

  1. 进入超级用户模式(sudo -s或su)。
  2. 递归授予所有用户完全权限(读取、写入、执行)(chmod -R o=rwx /path/to/project/root/

5

在我的情况下,我通过修改文件/app/config/app.php中的默认设置来解决了这个错误:

'url' => 'http://localhost',

我的本地自定义虚拟主机URL是:
'url' => 'http://mydomain.local',

这似乎是解决问题的关键改变(我也像这里建议的那样chmod了存储文件夹)

希望这能帮助你们中的一些人...


3

进一步说,如果你正在使用virtualbox/vagrant虚拟机环境,那么在我的Mac电脑上,我需要在主机(Mac)系统上执行chmod命令,但在我的Windows电脑上,直接在虚拟机上执行chmod命令就可以了。


2

您需要阅读安装文档:

http://laravel.com/docs/installation#configuration

请注意这里的细节:

Laravel requires one set of permissions to be configured - folders within app/storage require write access by the web server.

在那份文件中还有其他有用的东西,所以请确保阅读完整份文件。


2

我有同样的问题,以下是我解决问题的方法: 在你的httpd-vhosts.conf文件中,你需要添加配置到你的文件夹中,这是我的配置:

<VirtualHost *:80>
    ServerAdmin your@mail.com
    DocumentRoot "/home/carlospublic_html"
    ServerName carlos.local
    <Directory "/home/carlos/public_html">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>>

2

你需要添加:Options +FollowSymLinks

<IfModule mod_rewrite.c> 
RewriteEngine on 
Options +FollowSymLinks
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L] 
</IfModule>

现在它只是给了我一个500错误:内部服务器错误服务器遇到了内部错误或配置错误,无法完成您的请求。 - Carlo

1
您的服务器的Web根目录应指向Laravel安装的/public文件夹。这是Laravel初始化的index.html文件所在的位置。

0

我更喜欢这种方法,而不是将权限更改为777。 将Apache设置为以您的身份运行。

  1. 在终端中输入 id 命令,可以得到 uid=123(Myname)

  2. 打开 /etc/apache2/httpd.conf 文件并编辑它,将其改为使用您的用户名。

    <IfModule unixd_module>
       User Myname
       Group staff
    </IfModule>
    
  3. 回到终端:输入 sudo apachectl restart


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接