Laravel маршрут странное поведение

Следующий код

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, но есть ли у кого-нибудь объяснение этому странному поведению?

РЕДАКТИРОВАТЬ: @ Мохаммад Валид

Итак, я изменил мой route.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 ответ

Решение

Это потому, что 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>

Посмотрите на обсуждение косых черт.

Обратите внимание, что если вы удалите предыдущую строку, ваше приложение не сможет обрабатывать завершающие косые черты. Ex. если у вас есть маршрут

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 статусом.

Я проверил правило с помощью онлайн-тестера htaccess, и оно сработало, как и ожидалось, поэтому я полагаю, что проблема существует только в локальной разработке.Онлайн тестовый снимок

Другие вопросы по тегам