【问题标题】:Laravel 4 routes hitting public folder instead of views folderLaravel 4 路由命中公用文件夹而不是视图文件夹
【发布时间】:2014-08-13 03:22:33
【问题描述】:

我是 PHP / Laravel 的新手,这可能很愚蠢,但我无法让它工作。我在routes.php 文件中定义了这两条路线:

Route::get('about', function()
{
    return 'this is about';
});

Route::get('/', array('as'=>'home', function()
{
    return View::make('hello');
}));

如果我像这样访问我的应用程序:http://testapp.dev:88,它会正确呈现视图。但是,如果我像 http://testapp.dev:88/homehttp://testapp.dev:88/about

这样访问我的应用程序,我会得到 404

我检查了 apache 日志,发现了这些错误:

[错误] [客户端 127.0.0.1] 文件不存在: C:/tmp/Git_Repository/website/testapp/public/about

[错误] [客户端 127.0.0.1] 文件不存在: C:/tmp/Git_Repository/website/testapp/public/home

对为什么会发生这种情况有任何想法吗?

注意:我正在使用 Wamp 并具有以下 apache 2.2.22 配置

<Directory "C:/tmp/Git_Repository/website/">
    AllowOverride All
    Order Deny,Allow
    Allow from all
</Directory>

<VirtualHost *:88>
    DocumentRoot "C:\tmp\Git_Repository\website\testapp\public"
    ServerName testapp.dev
</VirtualHost> 

感谢您的帮助。

【问题讨论】:

  • 你的 public 目录中有 Laravel .htaccess 文件吗?
  • 看起来您的/public 目录中的.htaccess 文件丢失或重写规则不起作用。确保您已安装/启用 .htaccess 文件:github.com/laravel/laravel/blob/master/public/.htaccessmod_rewrite。顺便说一句:路由的名称(如['as' =&gt; 'home' ...] 不会使/home 成为可访问的URI,它只是为了在您的应用程序中更好地引用,例如URL::route('home')。所以您可以引用名称,不管实际路线是什么样子的。
  • 您还没有定义主路由,如果您无法访问已定义的路由,那么您的公共目录配置肯定有问题。我猜默认访问是localhost/public/about
  • .htaccess 文件在我的公共目录中,但重写模块被禁用。 Quasdunk,您的评论让我意识到了这一点,所以如果您想添加答案,我会将其标记为已接受。
  • 感谢大家的 cmets / 回答。

标签: php apache laravel laravel-4


【解决方案1】:

你没有在你的routes.php 文件中声明home 路由,无论如何,你可以试试这个:

<VirtualHost testapp.dev>
    DocumentRoot "C:\tmp\Git_Repository\website\testapp\public"
    ServerName testapp.dev
</VirtualHost>

还要确保您在windows/system32/drivers/etc/host 文件中添加了一个条目。喜欢:

# The ip address could be something like: 127.0.0.10
127.0.0.10 testapp.dev

然后重启Apache再试一次。

【讨论】:

    【解决方案2】:

    使用 Apache,如果 Laravel(或任何其他应用程序)似乎将 URL 映射到目录结构而不是定义的路由,原因很可能是缺少或无效的重写规则。

    首先确保您的公共目录中有 .htaccess 令人不寒而栗,寻找 like this 的东西:

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

    它包含在 if 语句中,并且仅在加载 Apache 模块 mod_rewrite 时才适用。为确保已加载,

    在 Windows 上:

    在您喜欢的文本编辑器中打开httpd.conf-文件(位于Apache 安装文件夹中的某个位置)并查找该行

    #LoadModule rewrite_module modules/mod_rewrite.so
    

    确保通过删除开头的# 取消注释

    在 Linux(可能还有 Mac)上

    直接跑吧

    $ a2enmod rewrite
    

    确保在那之后重新启动 Apache,你应该一切顺利。

    从 5.4 版开始,PHP 附带了一个基本的内置网络服务器。它不如 Apache 强大,也无法重写 URL,但仍然可以实现这种行为。这就是 Laravel 的 server.php 的用途。因此,如果您的开发环境不需要 Apache 的全部功能,您可以在 Laravel 的根目录(非公共)中使用 PHP 的内置服务器并将其传递给路由器文件:

    $ php -S localhost:8000 server.php
    

    现在您不必担心 Apache 和重写模块,它开箱即用。

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 2016-02-24
      • 2016-09-02
      • 2014-12-22
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2015-02-08
      相关资源
      最近更新 更多