Laravel 5需要使用Apache虚拟主机

时间:2015-06-14 01:40:08

标签: php apache .htaccess laravel laravel-5

当我加载非root用户的页面时,如果没有index.php,页面将不会在路由之前加载。我得到的错误:

 Not Found

 The requested URL /login was not found on this server.

 Apache/2.4.7 (Ubuntu) Server at mydomain.com Port 80

首先,我有一个包含以下内容的虚拟主机文件:

//also tried adding DirectoryIndex here before <directory>
<directory /var/www/mydomain.com>
    DirectoryIndex index.php
    AllowOverride ALL
</directory>

和我公开的.htacces:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

我在同一台服务器上有另一个具有相同.htaccess和appache配置的域,它运行正常。我也重启了apache。如果我在index.php / route页面上使用phpinfo,我会在Loaded Modules中看到:

mod_rewrite mod_setenvif 

当使用xampp运行网站localy时,一切正常。 几个小时我现在正在尝试,但我无法解决它或发现任何错误(日志是空的)或任何我尚未尝试的解决方案。

修改

我在数字海洋VPS上使用Ubuntu Ubuntu 14.04 x64。我试着再打开和关闭(如建议的那样)。 PHP版本5.5.9-1ubuntu4.9。我按照this教程配置了所有内容(除了可怕的部分)。我更改了apache日志的位置,并在给定目录上创建了一个文件error.log,但没有错误。

我目前的appache配置是:this(我已经三次检查了域名所在的白色部分)。

当我运行apache2ctl -t D DUMP_VHOSTS时,我得到了

enter image description here

这对我来说很好,也尝试禁用默认配置,但它没有帮助。

注意:我已经用mydomain.com替换了我的真实域名,实际上我在这些地方使用了我的真实域名。

思考我如何确定编辑的conf文件是域名所使用的?

9 个答案:

答案 0 :(得分:12)

这是Laravel 5的正确的备用htaccess规则,建议在默认设置不起作用时使用

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

我认为Options +FollowSymLinks起着重要作用,因为DirectotyIndex就像一个符号链接。

同时检查/app/config/app.php以确保您没有设置Config(&#39; app.url&#39;)以包含index.php。

如果您在子目录中安装了laravel,请参阅: How can I remove "public/index.php" in the url generated laravel?

答案 1 :(得分:8)

您是否尝试将其全部关闭(关闭),然后再将其打开?

如果一切如你所说,它应该有效。我会尝试重新启动以查看它是否会发生任何变化。

如果没有,请使用您正在使用的操作系统进行更新。

答案 2 :(得分:6)

我最终删除了完整的conf文件,然后从正在工作的文件中再次复制。我从laravel中取出了默认的.htaccess,它起作用了。不幸的是,我仍然不知道出了什么问题。当前的conf文件看起来像

<Directory /var/www/mydomain.com>
    AllowOverride ALL
    DirectoryIndex index.php
</Directory>

我的.htaccess在/ public

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

答案 3 :(得分:4)

我今天几乎遇到了同样的问题,@ dasper也帮助了我。我也在使用数字海洋Ubuntu 14.04,我必须运行命令a2enmod rewrite然后重新加载apache2。似乎即使重写出现,它实际上也不是。

答案 4 :(得分:3)

首先,确保启用了mode_rewrite。我相信你可能已经做到了这一点,但我想确保没有错过。

接下来,查看您运行的apache版本,因为语法已在2.2和2.4之间更改。这不应该是一个大问题,并且非常怀疑这是罪魁祸首,但可以在将来为您节省麻烦

接下来,尝试将重写条件放在vhost信息中而不是htaccess文件中。这有助于提高性能,并在重新启动apache时给你一个控制台警告/错误,其中htaccess错误可能会被压制。

<directory /var/www/mydomain.com>
    Options -MultiViews
    AllowOverride ALL
    RewriteEngine On

    RewriteRule ^(.*)/$ /$1 [L,R=301]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</directory>

除此之外,如果没有来自服务器的更多日志记录或信息,我将会感到茫然。您还可以将CustomLog添加到vhost中,并报告服务器处理的所有请求。

答案 5 :(得分:3)

问题可能在于虚拟主机配置和/或放错位置的 .htaccess 文件。

确保您的 .htaccess 文件位于 public / 文件夹中,并且 DocumentRoot 设置为该公共/文件夹。

而且,&lt;目录&gt; 指令不是控制您的虚拟主机,而是控制文件夹本身以及如何在服务器上访问(或无法访问)。要更改虚拟主机的配置,请在&lt;内部更改VirtualHost&gt; 指令。

以下是虚拟主机配置的示例:

<VirtualHost *:80>
    ServerName mydomain.com
    ServerAlias www.mydomain.com
    DocumentRoot "/var/www/mydomain.com/public"
    DirectoryIndex index.php
</VirtualHost>

这是默认的Laravel Apache配置:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

这是另一种选择:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

答案 6 :(得分:2)

尝试将Laravel根文件夹中的server.php重命名为index.php,并将.htaccess文件从/ public目录复制到Laravel根文件夹。

找到解决方案here

答案 7 :(得分:2)

我相信你的目录路径是错误的。最后需要/public,因为Laravel将该目录视为Web根目录。试试这个:

<directory /var/www/mydomain.com/public>
    DirectoryIndex index.php
    AllowOverride ALL
</directory>

但更好的解决方案是将.htaccess文件的内容放在虚拟主机中。像这样:

<VirtualHost *:80>
    DocumentRoot "/var/www/mydomain.com/public"
    ServerName mydomain.com
    ServerAlias *.mydomain.com

    <Directory "/var/www/mydomain.com/public">
        # Ignore the .htaccess file in this directory
        AllowOverride None

        # Make pretty URLs
        <IfModule mod_rewrite.c>
            <IfModule mod_negotiation.c>
                Options -MultiViews
            </IfModule>

            RewriteEngine On

            # Redirect Trailing Slashes...
            RewriteRule ^(.*)/$ /$1 [L,R=301]

            # Handle Front Controller...
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^ index.php [L]
        </IfModule>
    </Directory>
</VirtualHost>

此外,您应该通过运行来确保您的配置文件已加载:

apache2ctl -t -D DUMP_VHOSTS

这将打印所有已加载的虚拟主机的列表。如果您的列表不在该列表中,请确保通过运行启用它:

a2ensite [name_of_your_config_file]

然后使用以下命令重启apache:

service apache2 reload

答案 8 :(得分:2)

还有一点需要注意:不要忘记编辑/etc/hosts并添加127.0.0.2 yourdomain.com