【问题标题】:Laravel 4 All Routes Except Home Result in 404 ErrorLaravel 4除首页外的所有路由都导致404错误
【发布时间】:2020-10-03 07:12:19
【问题描述】:

我使用 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】:

只是为了一笑而过,看看/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 中没有其他内容,则也可以将其删除。
【解决方案2】:

在 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 文件
【解决方案3】:

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

在终端中使用以下命令:

$ sudo a2enmod rewrite
$ sudo service apache2 restart

还有魔法!

【讨论】:

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

遇到了完全相同的问题。

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

  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。
【解决方案5】:

适用于 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 中完美运行。有人知道原因吗?
【解决方案6】:

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

添加

RewriteBase /your_apache_alias

到 .htaccess 就可以了。

【讨论】:

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

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

<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On

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

【讨论】:

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

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

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

应该可以。

【讨论】:

    【解决方案9】:

    就像@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 应用程序。看起来真的很艰难的过程。
    【解决方案10】:

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

    php composer.phar dump-autoload
    

    【讨论】:

      【解决方案11】:

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

      $ sudo a2enmod rewrite
      $ sudo service apache2 restart
      

      希望如此。

      【讨论】:

        【解决方案12】:

        我遇到了这个问题(在手动安装 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

        【讨论】:

          【解决方案13】:

          很明显,问题的出现是因为“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>
          

          【讨论】:

            【解决方案14】:

            对于 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 使更改生效。

            【讨论】:

              【解决方案15】:

              前往

              nano /etc/nginx/sites-available/yoursite

              找到try_file并替换如下:

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

              【讨论】:

                【解决方案16】:

                我在带有 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
                

                【讨论】:

                  【解决方案17】:

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

                  Options -Indexes
                  Options +FollowSymLinks
                  

                  像魅力一样工作

                  【讨论】:

                    【解决方案18】:

                    如果使用 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中没有这个问题

                    【讨论】:

                      【解决方案19】:

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

                      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)

                      【讨论】:

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