Laravel 一条路线无效

Laravel ONE route not working

我在 Laravel 5.2 有一个项目,但有一个问题是一条路线不起作用。当我调用这条路由时,它会转到 Apache 404。

这些是我的一些路线:

Route::get      ('/icons',                 'IconController@index');
Route::get      ('/icons/create',          'IconController@create');
Route::post     ('/icons',                 'IconController@store');
Route::get      ('/icons/{id}/edit',       'IconController@edit');
Route::patch    ('/icons/{id}',            'IconController@update');
Route::delete   ('/icons',                 'IconController@destroy');

如您所见,这些是 CRUD 路由。我的应用程序中有更多这样的路线,但只是 '/icons/{id}/edit' 给我错误。

我已经尝试更改路由以调用视图,但错误仍然存​​在。

Route::get      ('/icons/{id}/edit',       function () {
    return view('welcome');
});

在我的开发机器中路由有效,但在生产服务器中不行。

开发者机器:OSX + Apache + php7

生产服务器:Ubuntu 16 + Apache + php7

我应该怎么做才能解决这些问题?如果您需要更多信息,请告诉我。谢谢。

编辑:

IconController 扩展了 GeneralController。

在 GeneralController 中我有:

public function edit($id, Request $request)
{
    $log = new ActivityLogRepository();
    $log->store($request, 'R');

    $this->request = $request;
    $segments = $request->segments();

    return view($this->viewDir.'.form', [
        'data' => $this->editData($id),
        'name' => $this->name,
        'icon' => $this->icon,
        'nameAction' => trans('messages.button_'.end($segments)),
        'baseRoute' => $this->baseRoute,
        'viewDir' => $this->viewDir,
    ]);
}

在 IconController 中我有:

protected function editData($id)
{
    $record = Icon::findOrFail($id);

    return (object)['record' => $record];
}

所有 CRUD 控制器的工作方式相同。

编辑 2:

Apache 日志。我访问了图标页面,然后访问了另一个 CRUD(客户端)。

my_ip - - [01/Sep/2017:13:21:40 +0000] "GET / HTTP/1.1" 302 1377 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
my_ip - - [01/Sep/2017:13:21:40 +0000] "GET /login HTTP/1.1" 200 2881 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
my_ip - - [01/Sep/2017:13:21:55 +0000] "POST /login HTTP/1.1" 302 1347 "http://example.com/login" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
my_ip - - [01/Sep/2017:13:21:55 +0000] "GET / HTTP/1.1" 200 11140 "http://example.com/login" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
my_ip - - [01/Sep/2017:13:21:56 +0000] "GET /images/users/thumbs/5968097a83fae.png HTTP/1.1" 304 181 "http://example.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
my_ip - - [01/Sep/2017:13:21:57 +0000] "GET /events/notification HTTP/1.1" 200 972 "http://example.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
my_ip - - [01/Sep/2017:13:22:04 +0000] "GET /icons HTTP/1.1" 200 7285 "http://example.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
my_ip - - [01/Sep/2017:13:22:11 +0000] "GET /icons/44/edit HTTP/1.1" 404 510 "http://example.com/icons" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
my_ip - - [01/Sep/2017:13:29:18 +0000] "GET /clients HTTP/1.1" 200 6523 "http://example.com/icons" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
my_ip - - [01/Sep/2017:13:29:20 +0000] "GET /clients/16/edit HTTP/1.1" 200 12344 "http://example.com/clients" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"

icons 是 Apache 中的标准别名。 Laravel 的 .htaccess 默认设置为 Laravel 将仅处理对不存在的文件或目录的请求。查看路线:

Route::get      ('/icons',                 'IconController@index');
Route::get      ('/icons/create',          'IconController@create');
Route::post     ('/icons',                 'IconController@store');

就Apache 而言,这些看起来都像是对文件的请求。这些文件不存在,因此 Laravel 处理请求,它们都工作正常。

Route::get      ('/icons/{id}/edit',       'IconController@edit');

icons/ 之后的尾部斜线表示 Apache 认为它是一个目录,而 Apache 确实 知道一个名为 icons 的目录 - 它的标准图标别名。所以Laravel不处理这个请求,留给Apache处理。但是在 Apache 的图标目录中没有名为“44”(或传递的任何 ID)的目录,因此 Apache 抛出 404。

解决方案是删除 Apache 的 icons 别名(假设您不需要它),as described for eg here,或者为此路由使用不同的名称,例如 my-icons 等.