Я новичок в Laravel, и это кажется отличной основой, но у меня есть вопрос, когда дело доходит до маршрутизации. Я хочу перенаправить все запросы на одно действие контроллера с именем PageController @, но когда префиксом является admin, я хочу, чтобы он направлялся в Admin \ AdminController @ view. У меня есть следующий код:
Route::get('/{slug?}', 'PageController@view'); Route::group(array('prefix' => 'admin', 'namespace' => 'Admin', 'before' => 'auth'), function() { Route::get('/', 'DashboardController@main'); });
Но когда я перехожу к: / admin, Laravel рассматривает его как slug вместо префикса. Есть ли что-то, кроме функции для первой строки, или просто нужно переключить вышеприведенные строки, чтобы получить правильный результат?
Новая проблема:
Но теперь у меня есть новая проблема, когда я перехожу на http://www.mysite.com/laravel/public/admin/ , Laravel перенаправляет меня на http://www.mysite.com/admin/ вместо вызова AdminController @ main , Когда я удаляю косую черту в конце, вот так: http://www.mysite.com/laravel/public/admin работает отлично.
Если вы укажете эти маршруты в обратном порядке, они должны работать. Сначала выполняйте свои самые конкретные маршруты, а затем более общие. Подумайте об этом как «поймите это, это и это, а затем вернитесь к этому родовому, когда ни один из вышеперечисленных не соответствует».
Ваша новая проблема заключается в правиле перенаправления (плохое, ИМО), с которым поставляется Laravel 4.1. Правила очень предполагают, что ваш общий каталог Laravel находится на корневом каталоге сервера. Вот правило:
RewriteRule ^(.*)/$ /$1 [L,R=301
Как вы можете видеть, это говорит «если текущий URL-адрес заканчивается косой чертой, просто перенаправьте его на / {url}», тем самым избавившись от косой черты. Все это хорошо и хорошо, пока ваша установка находится на корневом сервере вашего сервера.
Вы можете исправить это, указав RewriteBase
(в вашем случае RewriteBase /laravel/public
) выше этого правила в вашем файле public/.htaccess
, но, конечно, теперь это изменится с среды на окружающую среду. Вот почему я считаю, что изменение функции RedirectIftrailingSlash
в Laravel 4.0 является правилом .htaccess
чтобы быть плохой идеей.
Кроме того, вы можете полностью удалить этот RewriteRule
и попытаться не беспокоиться о том, что ваше приложение теперь будет отвечать на оба URL /laravel/public/admin
и /laravel/public/admin/
.
Проверьте, есть ли у вас папка «admin» в вашей общей папке. Laravel автоматически перенаправляет, если таковой имеется.
Поскольку порядок имеет значение, попробуйте это
Route::group(array('prefix' => 'admin', 'namespace' => 'Admin', 'before' => 'auth'), function() { Route::get('/', 'DashboardController@main'); }); Route::get('/{slug?}', 'PageController@view');
Проблема перенаправления Laravel перенаправляет URL-адрес с завершающим косой чертой на URL-адрес без привязки косой черты – поведение по умолчанию. (Если вы вводите URL без косой черты -> нет необходимости перенаправления) Фактическое перенаправление не является проблемой. Проблема в том, что Laravel не может угадать правильный «базовый» URL-адрес и создает для вас неправильный URL-адрес перенаправления.
Откройте app/config/app.php
и установите запись url
для соответствия корню вашего проекта. Я предполагаю, что в вашем случае это http://www.mysite.com/laravel/public
.
Для меня работает следующий RewriteRule. Мне пришлось удалить / in / $ 1 из ответа alexrussel выше. Включая / перенаправляет меня в корневую папку.
#For http://localhost/work/proj1/public/a/ RewriteBase is /work/proj1/public RewriteBase /repo/qs/public RewriteRule ^(.*)/$ $1 [L,R=301]
Я использую laravel v4.2, apache v2.4.7, php v5.5.9 на Linux Mint 17 64-bit.
Если вы знаете имя каталога, создайте для него правило. Это отлично работает для меня:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On RewriteRule ^(forum)($|/) - [L] # Redirect Trailing Slashes... RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>