Laravel快速入门指南路由无法正常工作

37

我刚接触 Laravel,于是去官方文档开始学习。但是文档中存在很多空白,所以我需要花费很多时间并进行搜索才能弥补这些缺失,最终成功搭建好了 Laravel 环境。现在我已经按照快速入门指南完成了下一步——创建了路由。

Route::get('users', function()
{
     return 'Users!';
});

现在它说:

Now, if you hit the /users route in your web browser, you should see Users!

所以我联系了:

http://localhost/laravel/users 

但是却收到了404?我尝试过

http://localhost/laravel/public/users 

但是还是404错误?我已经完全按照快速入门指南中的步骤进行了操作,我错过了什么吗?


1
你确定 Laravel 在那里吗?你能访问 public 中的其他内容吗? - Phill Sparks
8
本地主机/ Laravel / public / index.php / users 是什么? - Phill Sparks
1
听起来你的htaccess/rewrite没有起作用。请三次检查您是否已经打开了mod rewrite,并且正确配置了AllowOverride。我建议在不久的将来您也应该研究一下虚拟主机。 - Phill Sparks
8
我不明白为什么Laravel有450,000次下载(!),但除了我们之外没有人遇到这个问题!Laravel的教程很糟糕,如果你完全按照它们的做法去做,就会遇到那个错误... - Sliq
我遇到了这个问题,我的结论是服务器没有启用mod-rewrite。 - Alexey
显示剩余4条评论
9个回答

74

看起来您的Laravel应用程序可以通过Apache HTTP别名访问,因为您的URL看起来像:http://localhost/laravel/。如果是这种情况,并且假设http://localhost/laravel指向您的public目录,则请按照以下步骤进行操作:

  1. 尝试导航到您期望的路由,并在其前面添加/index.php/,在您的情况下:http://localhost/laravel/index.php/users。如果它有效(没有404),则您的问题在于Apache HTTP的Rewrite模块配置,您应该按照下一步操作。
  2. 编辑文件public/.htaccess
  3. RewriteEngine On行下添加RewriteBase /laravel/
  4. 尝试导航到现有路由。

基本上,如果您的应用程序驻留在别名或虚拟目录中(例如http://localhost/alias),则应将条目添加到重写规则中,以将基本目录重写为alias


2
嗨,Rubens,我觉得我现在接近成功了。http://localhost/laravel/index.php/users 不起作用,但如果我在URL中加入public,它就像这样工作:http://localhost/laravel/public/index.php/users。重写基础并没有起作用,但我猜想我必须在某个地方将/public目录合并进去? - twigg
1
你正在使用WAMP吗?那么请前往托盘图标 > 点击 > Apache > 别名目录 > 添加别名... 然后写一个别名,比如 test,然后将目录设置为 C:\path\to\your\public\directory,最后导航到 http://localhost/test - Rubens Mariuzzo
1
这个确切的解决方案(Rewritebase...)在我使用WAMP安装的Laravel上有效。我的别名是/localhost/laravel-demo/。谢谢。 - Dizzley
6
请确保在 httpd.conf 中启用了 mod_rewrite。参见 https://dev59.com/kmYr5IYBdhLWcg3wpLr9#16864142。 - Jake Z
1
这非常有帮助。我遇到了你所描述的问题。 - AturSams
显示剩余5条评论

5
问题已经由Rubens清楚地解释了。一个更简单的解决方案是使用提供的内置PHP服务器,只需发出此命令即可。
php artisan serve --port=8080

请注意,这里使用的端口是8080,你可以省略它。现在,你可以通过访问以下网址来浏览该站点。
localhost/users

然后它应该能够工作!


3

2
我曾经遇到同样的问题,花费了数小时来解决它。我在同一域名下有几个应用程序,但位于不同的段中。所以Laravel的URL是http://myhostname/mysubdir/
我的控制器仅能作为http://myhostname/mysubdir/index.php/mycontroller工作。
在/var/www/.../public/.htaccess文件中,我添加了RewriteBase /mysubdir,然后就可以正常工作了!

1

我知道这个问题已经有4年了,但它仍然具有重要意义。Rubens Mariuzzo回答得很正确,但我想补充一些观点。你说:

"文档中存在大量漏洞,因此需要花费大量的精力和搜索来填补这些空白,以便设置Laravel"

对于初学者来说,找到正确的配置Laravel的方法是困难的。一旦掌握了它,开发Laravel就很有趣 :)。有一定的正确做法。

  1. 下载Laravel
  2. 配置DB
  3. 在.env中映射DB
  4. 创建认证:php artisan make:auth
  5. 同时创建模型和迁移:php artisan make:model Todo -m
  6. 迁移:php artisan migrate
  7. 同时创建控制器和路由:php artisan make:controller TodoController --resource
  8. 为每个操作创建视图
  9. 编写控制器代码

详细说明可以在这篇博客中找到 http://masterlaravel.blogspot.in/2017/08/laravelquick-start-composer-create.html


0
请参考以下链接并查看RoboTamer的配置:

http://forums.laravel.io/viewtopic.php?id=511

这解决了我的问题,和你的问题一样

Nginx 的解决方案:

server {

    server_name .laravel.dev;
    root /home/tamer/code/laravel/public;

    index index.php index.html;

    #browse folders if no index file
    autoindex on; 

    # serve static files directly
    location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
        access_log off;
        expires max;
    }

    # removes trailing slashes (prevents SEO duplicate content issues)
    if (!-d $request_filename)
    {
        rewrite ^/(.+)/$ /$1 permanent;
    }

    # enforce NO www
    if ($host ~* ^www\.(.*))
    {
        set $host_without_www $1;
        rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
    }


    # canonicalize codeigniter url end points
    # if your default controller is something other than "welcome" you should change the following
    if ($request_uri ~* ^(/lobby(/index)?|/index(.php)?)/?$)
    {
        rewrite ^(.*)$ / permanent;
    }

    # removes trailing "index" from all controllers
    if ($request_uri ~* index/?$)
    {
        rewrite ^/(.*)/index/?$ /$1 permanent;
    }

    # unless the request is for a valid file (image, js, css, etc.), send to bootstrap
    if (!-e $request_filename)
    {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }

    # catch all
    error_page 404 /index.php;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/tmp/php.socket;
        fastcgi_index index.php;
        #include fastcgi_params;
        include /home/tamer/code/nginx/fastcgi_params;
    }
    access_log /home/tamer/code/laravel/storage/logs.access.log;
    error_log  /home/tamer/code/laravel/storage/logs.error.log;

}


1
请在此处总结答案,以防网站离线。 - Evan
注意:所链接的文章描述了在Nginx下的安装解决方案。Rubens的答案适用于Apache。 - Dizzley

0

谢谢。@rubens提供的上述知识和@GaryJ在这里发表的评论促使我在Apache虚拟主机文件中进行了以下操作,以使其正常工作。

从vhosts配置节点中复制了这些行,来自laravel的.htaccess文件。 删除了我的.htaccess文件(它无论如何都没有被应用,我使用的是Windows Apache虚拟主机,laravel环境)。

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]

更好的: 后来阅读了 @Ag0r0 的回复,它起作用了。我错过了允许覆盖,使上述操作是必要的。一旦 allowoverride 都在那里,设置本身就起作用了。

0
在我的情况下(Ubuntu 14.04 LTS & Apache 2.2),我卡在了@Rubens'解决方案的第1步。 我可以看到带有此URL的页面:http://localhost/laravel/index.php/users,但第2步和其他步骤均无法正常工作。
此外,我尝试将RewriteBase /laravel/public添加到.htaccess中,但它也没有起作用。
然后,我借助这个很棒的教程设置了一个新的虚拟主机:https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts (他们在这些教程方面非常出色) 除了教程之外,我还像这样在example.com.conf文件中设置了DocumentRoot
DocumentRoot /var/www/laravel/public

是的,public 在这里很重要。

顺便说一下,不要把RewriteBase /laravel/放到你的.htacces文件中,否则会出现HTTP/500错误。

现在,我可以看到example.com/users页面了。


-3

我的上一篇帖子描述了问题,但被删除了,但它与这里描述的情况类似。

无论如何...我已经尝试了这里以及其他页面描述的所有可能性,但是我没有找到解决我的问题的方法。

Laraval的新安装根本没有起作用...在尝试了这篇文章中的所有内容后,我决定创建另一个全新的安装程序,奇迹发生了,这个安装程序实际上正在运行...

所以我的建议是:如果您无法解决此问题,请尝试创建Laravel的另一个安装程序,它可能实际上可以工作。

如果您从头开始启动,则这实际上可能是解决问题的最简单方法。


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