Laravel路线奇怪的行为

时间:2014-08-29 12:55:01

标签: laravel parameters routing

以下代码

Route::get('test/{n}', function ($n) {
    return $n;
});

App::missing(function () {
    return Response::make("Dude, that's a 404 !", 404);
});

适用于

之类的任何内容
http://localhost/myproject/public/test/something

但是

http://localhost/myproject/public/test/

重定向到

http://localhost/test

我认为它应该显示

Dude, that's a 404 !

我可能错误地搜索了SO论坛,但有没有人对这种奇怪的行为有解释?

编辑:@Mohammad Walid

好的,所以,我将routes.php更改为:

Route::get('/', 'HomeController@showWelcome');

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

App::missing(function () {
    return Response::make("Dude, that's a 404 !", 404);
});

没有删除了您在public/.htaccess中谈到的那一行。

这有效:

base_url/test

但这并不是(重定向到localhost/test):

base_url/test/

怎么可能,因为你说删除该行会删除该功能?

EIDT 2:

由于事实证明问题来自MAMP没有正确解释尾部斜线重定向条件,因此在MAMP错误库中创建了错误报告:

http://bugs.mamp.info/view.php?id=4586

1 个答案:

答案 0 :(得分:2)

及其'因为Laravel默认重定向尾部斜杠。

app / public / .htaccess 文件中,您可以找到以下内容:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301] #This line causes the problem

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

将其更改为:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

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

查看trailing slashes discussion

注意如果删除上一行,您的应用程序将无法处理尾随斜杠。 防爆。如果你有路线

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

假设已请求base_url/test/而不是base_url/test服务器将以404状态回复。

<强>更新

似乎这个问题只发生在本地开发中(我使用XAMPP)。

该规则的预期结果如下:

.htaccess
RewriteRule ^(.*)/$ /$1 [L,R=301]

Input (request)
http://localhost/website/test/

Output (after redirect)
http://localhost/website/test

但我们在本地发展中实际拥有的是:

.htaccess
RewriteRule ^(.*)/$ /$1 [L,R=301]

Input (request)
http://localhost/website/test/

Output (after redirect)
http://localhost/test #this is wrong, according to the rule above it should redirects to http://localhost/website/test

如果您删除规则,那么您将拥有以下内容:

Request
http://localhost/website/test

Response
test


Request
http://localhost/website/test/

Response
Status 404
Dude, that's a 404 !

The expected response:
test

这就是我的意思

  

您的应用程序无法处理尾随斜杠。

     

服务器将以404状态响应。

我已经使用online htaccess tester测试了该规则并且它按预期工作,这就是为什么我认为问题仅存在于本地开发中。 Online test snapshot