Laravel4除家以外的所有路由导致404错误

我使用 Composer 安装了 Laravel 4,并且建立了一个虚拟主机:

<?php


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

这不是:

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

我要打的是 /tasks台的 TasksController:

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。

68621 次浏览

当你定义家以外的东西时,你不需要:

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

应该可以。

开个玩笑,看看 /index.php/hello能不能用。

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

由于 Laravel4是从静态文件中的映射自动加载文件,因此在添加新控制器时需要更新该文件。运行以下命令重新生成静态文件:

php composer.phar dump-autoload

在 WAMP (Windows8)上运行 Laravel4时遇到了同样的问题。
对我有效的解决办法是:

  1. 打开 apache httpd.conf 并找到以下行:

    #LoadModule rewrite_module modules/mod_rewrite.so
    
  2. Uncomment this line (remove the #)
  3. Save httpd.conf
  4. Restart WAMP

It should be working!

即使在启用 mod _ rewrite 之后,如果您使 laravel/public 文件夹别名,也可能会遇到这个问题。

添加

RewriteBase /your_apache_alias

访问.htaccess 可以解决这个问题。

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

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

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

在终端中使用以下命令:

$ sudo a2enmod rewrite
$ sudo service apache2 restart

还有魔法!

就像“ GaryJ &”MartinGomez 说的。这是应该为所有在 Apache 服务器上运行的 laravel 4项目在 公众人士文件夹中设置的 . htaccess内容:

<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>

在.htaccess 文件中,只需在重写规则打开后添加以下内容。

Options -Indexes
Options +FollowSymLinks

非常有效

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

$ sudo a2enmod rewrite
$ sudo service apache2 restart

希望如此。

也有同样的问题。

为了解决这个问题,我需要做两件事:

  1. 在 Apache 中启用 Rewrite _ module 重写 _ 模块
  2. 允许覆写从 Nothing 更改为 全部,例如(Apache 2.4.9) :

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

FYI:
use Laravel Homestead together with VirtualBox and Vagrant instead of WAMP. It contains Nginx instead of Apache but everything works by default as it is configured for Laravel explicitly.

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

我尝试了所有这些都没有成功,然后我发现了另一个帖子,并改变了我的.htaccess:

<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On


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

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

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


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

但是不起作用,所以我尝试了所有相关文章中找到的所有东西,但是不足以解决我的问题,所以我在 httpd.conf 上找到了下面这行:

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

所以我把“拒绝”改成了“授予”,并在我的.htaccess 上注释了这一行:

#RewriteBase /

成功了!我认为这句话让阿帕奇没有考虑到。你的项目的 htaccess 文件,所以把它变成理所当然的区别。 希望这能帮助有同样问题的人。

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

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

去吧

Nano/etc/nginx/sites- 可用/yoursite

查找 try _ file 并替换如下:

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

我在 Ubuntu 14.04和 Lumen 5.4上也遇到过类似的问题。

对我来说,解决方案分为两部分。首先在 vhost 文件 /etc/apache2/sites-enabled/my_vhost.conf中,在声明 DocumentRoot之后,我必须添加以下 <Directory>条目以允许重写:

    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

对于 UBUNTU 用户 -对 UBUNTU18.04进行了测试

1-启用 mod 重写

sudo a2enmod rewrite

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

sudo nano /etc/apache2/apache2.conf

将此块中的 AllowOverride 从 Nothing 更改为 All

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

3-重启 Apache

sudo service apache2 restart

如果使用 IIS 作为 web 服务器,那么在公用文件夹中创建一个名为 web.config 的文件,或者在 index.php 中使用这个配置:

<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 edit. htaccess 文件并添加此部分

<Directory />
AllowOverride All
</Directory>

在 linux 和 nginx 中没有这个问题