【问题标题】:Laravel 4 All Routes Except Home Result in 404 ErrorLaravel 4除家庭外的所有路线都导致404错误
【发布时间】:2012-11-10 23:40:57
【问题描述】:

我使用 Composer 安装了 Laravel 4,还设置了一个虚拟主机。目前,只有根路由有效:

<?php

Route::get('/', function()
{
    return View::make('hello');
});

这不是:

Route::get('/hello', function()
{
    return View::make('hello');
});

我想打的是TasksController/tasks

Route::resource('tasks', 'TasksController');

这也给了我 404 错误。我可能做错了什么?我的项目根目录中有一个默认的 .htaccess 文件:

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

我在 Mac 上使用 localhost。

【问题讨论】:

  • Amit:你的问题解决了吗?如果是,请发布您的解决方案,因为我的 laravel 项目面临同样的问题。提前致谢
  • @AmitErandole 哎呀。我们似乎错过了您发布的 gist.github.com/4131966 的要点。

标签: laravel laravel-4 routing http-status-code-404 laravel-routing


【解决方案1】:

在定义 home 以外的任何内容时,您不需要 /:

Route::get('hello', function()
{
    return View::make('hello');
});

应该可以。

【讨论】:

    【解决方案2】:

    只是为了一笑而过,看看/index.php/hello 是否有效。

    如果是这样,那么很可能是.htaccess 问题。

    【讨论】:

    • 废话! /index.php/hello 有效,但 /index.php/tasks 现在给我一个 500 错误。怎么回事?我将使用 htaccess 内容更新我的问题
    • 我不明白:我开启了 mod rewrite 并且 AllowOverride 也设置为 All
    • 检查 .htaccess 中的 anything 是否正常工作 - 如果您正在运行 Apache 2.4,请注意自以前版本以来的更改,关于 @ 中的 Require all grantedAllowOverride all 987654325@ 块在您的虚拟主机上。并重新启动 Apache 以求好运。
    • 重新启动,一切正常,但 .htaccess 文件仍然没有运气
    • 尝试删除 IfModule 条件。由于您可以访问主机/虚拟主机,因此您可以很快启用该模块(如果不是) - 因此不需要在每个请求上都检查它。同样,尝试将其移出 .htaccess 并移至 vhost 中的 &lt;Directory /&gt;...&lt;/Directory&gt; 块 - 如果您的 .htaccess 中没有其他内容,则也可以将其删除。
    【解决方案3】:

    由于 Laravel 4 是从静态文件中的地图自动加载文件,因此您需要在添加新控制器时更新该文件。运行以下命令重建静态文件:

    php composer.phar dump-autoload
    

    【讨论】:

      【解决方案4】:

      在 WAMP(Windows 8)上运行 Laravel 4 时遇到同样的问题。
      对我有用的解决方案是:

      1. 打开 apache httpd.conf 并找到这一行:

        #LoadModule rewrite_module modules/mod_rewrite.so
        
      2. 取消注释此行(删除#
      3. 保存httpd.conf
      4. 重启 WAMP

      应该可以了!

      【讨论】:

      • 我的 httpd.conf 中没有 #LoadModule rewrite_module modules/mod_rewrite.so :( 那是 Windows8 的东西吗?我在 Windows7 上使用 XAMPP
      • 在 Ubuntu 上,这将是:sudo a2enmod rewrite 后跟 sudo service apache2 restart
      • 完美!这解决了我的问题。
      • 我只想补充一点,您可能需要将 AllowOverride FileInfo 设置为 httpd.conf 中的目录,或者只需将重写指令移动到该目录段并放弃 .htaccess 文件
      【解决方案5】:

      即使在启用 mod_rewrite 之后,如果您为 laravel/public 文件夹设置别名,您也可能会遇到此问题。

      添加

      RewriteBase /your_apache_alias
      

      到 .htaccess 就可以了。

      【讨论】:

      • 我遇到了同样的问题,使用的是 Ubuntu 服务器 14.04。在 apache2.conf 中使用别名,mod_alias 已经启用。将 rewritebase 添加到公用文件夹上的文件 .htaccess 确实解决了这个问题。谢谢!
      • 谢谢,就是这样!
      【解决方案6】:

      我遇到了这个问题(在手动安装 Apache 2.2 的 Windows 上),原因是我的 VirtualHost 中缺少 AllowOverride,因为 httpd.conf 中的根目录默认为 None。

      FileInfo Options=MultiViews 是 Laravel 的 .htaccess 所需的最小集合

      例如

      <VirtualHost *:80>
          DocumentRoot "C:/htdocs/domain.com/laravel/public"
          ServerName foo.domain.com
      
          <Directory "C:/htdocs/domain.com/laravel/public">
              AllowOverride FileInfo Options=MultiViews
          </Directory>
      </VirtualHost>
      

      如果这不起作用并且您不关心安全性,请使用AllowOverride All

      【讨论】:

        【解决方案7】:

        我遇到了同样的问题,解决方法是在 Apache2 上启用重写模块

        在终端中使用以下命令:

        $ sudo a2enmod rewrite
        $ sudo service apache2 restart
        

        还有魔法!

        【讨论】:

        • 你和@GaryJ 拯救了我的一天!谢谢
        • 作品,谢谢
        • 你可以先检查mod_rewrite是否开启。
        【解决方案8】:

        就像@GaryJ 和@MartinGomez 所说。这是 .htaccess 的内容,应该在 public 文件夹中为您在 Apache 服务器上运行的所有 laravel 4 项目设置:

        <IfModule mod_rewrite.c>
            <IfModule mod_negotiation.c>
                Options -MultiViews
            </IfModule>
        
            RewriteEngine On
            RewriteBase /
        
            # Redirect Trailing Slashes...
            RewriteRule ^(.*)/$ /$1 [L,R=301]
        
            # Handle Front Controller...
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^ index.php [L]
        </IfModule>
        

        【讨论】:

        • 天哪.. 这是经过数小时的其他可以想象的事情后唯一有效的方法。我正在使用 Laravel 7 ...尝试运行一些 Laravel 应用程序并进行安装是一场噩梦。我希望他们有更好的错误处理,让人们知道如果打开调试,页面上出了什么问题。也许是因为我正在安装一个较旧的 Laravel 应用程序。看起来真的很艰难的过程。
        【解决方案9】:

        此更新对我有用。在 .htaccess 文件中,只需在打开 Rewriterules 后添加以下内容。

        Options -Indexes
        Options +FollowSymLinks
        

        像魅力一样工作

        【讨论】:

          【解决方案10】:

          之前的回答有一点瑕疵。 这可能会有所帮助。

          $ sudo a2enmod rewrite
          $ sudo service apache2 restart
          

          希望如此。

          【讨论】:

            【解决方案11】:

            遇到了完全相同的问题。

            我需要做两件事来解决这个问题:

            1. 在 Apache 中启用 rewrite_module
            2. AllowOverride 从 None 更改为 All,例如(Apache 2.4.9):

              <Directory "c:/www">
                  Options Indexes FollowSymLinks MultiViews
                  AllowOverride All
                  Require all granted
              </Directory>
              

            仅供参考:
            将 Laravel Homestead 与 VirtualBox 和 Vagrant 一起使用,而不是 WAMP。它包含 Nginx 而不是 Apache,但默认情况下一切正常,因为它是为 Laravel 明确配置的。

            【讨论】:

            • 这在我的服务器上部署时对我有用。 Vagrant 是一个很好的建议,如果你想坚持使用 Apache,我会更明确地建议 laravel.com/docs/4.2/homesteadbox.scotch.io
            • AllowOverride 为我提供了全新的 xampp 安装和虚拟主机
            • 我遇到了完全相同的问题。我还为 apache 执行了“sudo a2enmod rewrite”命令,然后在 apache2.conf 文件中将 AllOverride 从 None 更改为 All。
            【解决方案12】:

            很明显,问题的出现是因为“mod_rewrite”,在某些情况下,只需在 Apache 中启用这个模块就足以解决它。

            但是,就我而言,我必须通过以下方式扩展 VirtualHost 的配置:

            <VirtualHost *:80>
            
                ServerName adplus.local
            
                ServerAdmin sergey.donchenko@gmail.com
                DocumentRoot /var/www/adplus.local/project/public
            
                **<Directory "/var/www/adplus.local/project/public">
                    AllowOverride All
                </Directory>**
            
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
            </VirtualHost>
            

            【讨论】:

              【解决方案13】:

              我尝试了所有这些都没有成功,然后我找到了另一个帖子并将我的 .htaccess 更改为:

              <IfModule mod_rewrite.c>
              Options -MultiViews
              RewriteEngine On
              
              RewriteCond %{REQUEST_FILENAME} !-f
              RewriteRule ^ /index.php [L]
              </IfModule>
              

              【讨论】:

              • 完美。实际上我忘记在我的根目录中复制 .htaccess
              【解决方案14】:

              此评论可能有点晚,但可能会有所帮助。像这样路由到另一个视图时,我遇到了同样的问题:

              Route::get('index', function () {
              return view('index');
              });
              
              Route::get('login', function () {
              return view('login');
              });
              

              但是没有用,所以我尝试了在所有相关帖子中找到的所有内容,但还不足以解决我的问题,所以我在 httpd.conf 上找到了以下几行:

              <Files ".ht*">
              Require all denied
              </Files>
              

              所以我将“拒绝”更改为“授予”,并在我的 .htaccess 中评论了这一行:

              #RewriteBase /
              

              并且工作!我认为这些行使 Apache 不考虑您项目的 .htaccess 文件,因此将其设置为授予会有所不同。 希望这可以帮助遇到同样问题的人。

              在 Apache Server 2 @ Manjaro Linux 上工作(基于 Archlinux)

              【讨论】:

                【解决方案15】:

                对于 Nginx 用户,您可能复制了 default 虚拟主机 - 但 Laravel 需要对 location 指令进行一些自定义,以允许 Laravel 应用程序而不是 Nginx 进行路由。

                在您的 /etc/nginx/sites-available/your-site-name 中,将 location 指令替换为:

                location / {
                    try_files $uri $uri/ /index.php$is_args$args;
                }
                

                然后运行sudo service nginx reload 使更改生效。

                【讨论】:

                  【解决方案16】:

                  前往

                  nano /etc/nginx/sites-available/yoursite

                  找到try_file并替换如下:

                  try_files $uri $uri/ /index.php?$query_string;

                  【讨论】:

                    【解决方案17】:

                    我在带有 Lumen 5.4 的 Ubuntu 14.04 上遇到了类似的问题。

                    解决方案对我来说是两部分。首先在我的虚拟主机文件/etc/apache2/sites-enabled/my_vhost.conf 中,我必须在声明我的DocumentRoot 之后添加以下&lt;Directory&gt; 条目以允许覆盖:

                        DocumentRoot /var/www/path/to/my/app/public
                    
                        <Directory "/var/www/path/to/my/app/public">
                                Options FollowSymLinks
                                AllowOverride All
                    
                                Order allow,deny
                                Allow from all
                        </Directory>
                    

                    接下来,我必须启用重写:

                    sudo a2enmod rewrite
                    sudo service apache2 restart
                    

                    【讨论】:

                      【解决方案18】:

                      适用于 UBUNTU 用户 - 已针对 Ubuntu 18.04 测试

                      1- 启用模组重写

                      sudo a2enmod rewrite
                      

                      2- 更改 apache conf 文件中的 AllowOverride:

                      sudo nano /etc/apache2/apache2.conf
                      

                      在此块中将 AllowOverride 从 None 更改为 All

                      <Directory /var/www/>
                          Options Indexes FollowSymLinks
                          AllowOverride All
                          Require all granted
                      </Directory>
                      

                      3- 重启 Apache

                      sudo service apache2 restart
                      

                      【讨论】:

                      • 也在 laravel 5.1 上工作。不错!
                      • 在带有 Laravel 8 的 Ubuntu 20 上发挥魅力。谢谢!
                      • 在 Ubuntu 18 和 Laravel 8 中完美运行。有人知道原因吗?
                      【解决方案19】:

                      如果使用 IIS 作为 Web 服务器,请在 public 文件夹或 index.php 所在的位置创建一个名为 web.config 的文件,并使用此配置:

                      <configuration>
                          <system.webServer>
                              <rewrite>
                                  <rules>
                                      <rule name="Imported Rule 1" stopProcessing="true">
                                          <match url="^" ignoreCase="false" />
                                          <conditions logicalGrouping="MatchAll">
                                              <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                                              <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                                          </conditions>
                                          <action type="Rewrite" url="index.php" />
                                      </rule>
                                  </rules>
                              </rewrite>
                          </system.webServer>
                      </configuration>
                      

                      如果您使用 apache 编辑 .htaccess 文件并添加此部分

                      <Directory />
                          AllowOverride All
                      </Directory>
                      

                      在linux和nginx中没有这个问题

                      【讨论】:

                        猜你喜欢
                        • 2020-10-03
                        • 2014-07-31
                        • 2016-10-05
                        • 2018-10-23
                        • 2014-12-21
                        • 2021-12-23
                        • 2020-06-05
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多