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 был создан отчет об ошибках:
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, и оно сработало, как и ожидалось, поэтому я полагаю, что проблема существует только в локальной разработке.