Laravel slash после перенаправления URL-адресов в корневую папку

Я новичок в 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>