Mis rutas devuelven un 404, ¿cómo puedo solucionarlas?

81

Acabo de comenzar a aprender el marco de Laravel y tengo un problema con el enrutamiento.

La única ruta que funciona es la ruta de inicio predeterminada que se adjunta a Laravel de fábrica.

Estoy usando WAMP en Windows y usa PHP 5.4.3 y Apache 2.2.22, y también tengo habilitado mod_rewrite y eliminé el 'index.php' del archivo de configuración application.php para dejar una cadena vacía.

Creé un nuevo controlador llamado Usuario :

class User_Controller extends Base_Controller {

    public $restful = true;

    public function get_index() 
    {
        return View::make('user.index');
    }
}

Creé un archivo de vista en application / views / user / llamado index.php con un código HTML básico, y en routes.php agregué lo siguiente:

Route::get('/', function () {
    return View::make('home.index');
});

Route::get('user', function () {
    return View::make('user.index');
});

La primera ruta funciona bien cuando visito la raíz ( http://localhost/mysite/public) en mi navegador web, pero cuando intento ir a mi segunda ruta http://localhost/mysite/public/user, obtengo un error 404 No encontrado. ¿Por qué estaría pasando esto?

JasonMortonNZ
fuente
El .htaccess no se modifica, tal como estaba listo para usar.
JasonMortonNZ
Parece que WAMP fue el problema. He cambiado a XAMPP ahora y todo funciona muy bien y como debería. ¿Debo responder a esta pregunta explicando que WAMP era el problema?
JasonMortonNZ
@AquilaSolutions Sí, puedes. Para que todos vean claramente que su problema está resuelto ahora.
Jocelyn

Respuestas:

25

¿Ha intentado agregar esto a su archivo de rutas Route::get('user', "user@index")?

El trozo de texto antes de que el @, useren este caso, dirigirá la página al controlador usuario y el fragmento de texto después de la @, index, dirigirá el guión a la userfunción public function get_index().

Veo que estás usando $restful, en cuyo caso se podría establecer su Routea Route::any('user', 'user@index'). Esto manejará ambos POSTy GET, en lugar de escribirlos por separado.

Papá Pitufo
fuente
Cambio de WAMP a XAMPP porque el problema persistió. Después de iniciar un proyecto nuevo en el servidor XAMPP y usar el símbolo '@' en lugar del '.' funciona muy bien ahora.
JasonMortonNZ
1
Funciona bien con WAMP, solo tiene que habilitar rewrite_module. Vea el comentario de @ Muvera a continuación.
ajon
3
Sé que esta es una respuesta anterior, pero tuve un problema similar: ¡se agregó una nueva ruta y no funcionó! (404). ¡Solo necesitaba borrar las rutas almacenadas en caché! usando php ruta artesanal: claro
trainoasis
118

En mi instalación de Ubuntu LAMP, resolví este problema con los siguientes 2 cambios.

  1. Habilitar mod_rewrite en el servidor Apache: sudo a2enmod rewrite.
  2. Edite /etc/apache2/apache2.conf , cambiando la directiva "AllowOverride" para el directorio / var / www (que es la raíz de mi documento principal):AllowOverride All

Luego reinicie el servidor Apache: service apache2 restart

Andrew Vickers
fuente
Esto solucionó este problema para mí en una máquina vagabunda descargada de puphpet.
winkbrace
5
Gracias, eres un salvavidas.
Hassan Murtaza
3
Muchas gracias, he perdido mis 4 horas para encontrar esto
Anshul Mishra
Trabajó para mí en MacOS High Sierra 10.13.3 con Laravel-5.4
Yevgeniy Afanasyev
2
@McSonk, probablemente la pregunta sea para Windows. Esta solución alternativa funciona para Ubuntu. Gracias amigo.
Fendi Septiawan
63

Usando WAMP, haga clic en el icono de wamp -> apache-> módulos de apache-> desplácese y marque rewrite_module Reinicie un LoadModule rewrite_module

Tenga en cuenta que la aplicación del servidor se reinicia automáticamente una vez que habilita "rewrite_module"

Mario Uvera
fuente
MUCHAS GRACIAS, he intentado solucionar este problema desde ayer
Moe
2
Esto parece sucederme cada vez que instalo / reinstalo WAMP y Laravel en una computadora. Este es siempre el problema. Con suerte, finalmente se memorizará;)
Kenmore
En Ubuntu 14.04, funcionó 'sudo a2enmod rewrite' y luego 'sudo service apache2 restart'.
nspo
para los sistemas Linux, habilite el módulo de reescritura sudo a2enmod rewritedespués de ese reinicio sudo service apache2 restart
aimme
35

¿Ha intentado comprobar si

http://localhost/mysite/public/index.php/user 

¿estaba trabajando? Si es así, asegúrese de que todas las carpetas de su ruta no tengan letras mayúsculas. Tuve la misma situación y me ayudó convertir letras a minúsculas.

user1930566
fuente
Gracias. Estoy revisando el libro de Laravel (Laravel Starter) paso a paso y me quedé atascado con el enrutamiento hacia un cierre (página 13). Esto resolvió ese problema para mí.
Steve Lindsey
Esto resolvió mi problema. Tenía un .htaccess en la raíz de mi carpeta de apache que rompió el htaccess de laravel.
Maarten00
Esto resolvió otro problema que tenía. Usando Laravel para generar páginas, y Angular para llamar a REST, en Windows la llamada api/branchesfuncionó, pero en Linux, tuve que cambiar esta url como: ¿ index.php/api/branchesAlguna forma de resolver esto para tener las mismas urls?
miroslavign
Nunca pensé que
distingue entre
en su lugar colocar el archivo .htaccess de la carpeta / pública a la raíz del proyecto, entonces se puede acceder porhttp://localhost/mysite/user
Rohan Khude
9

Estaba teniendo el mismo problema al usar EasyPHP. Encontré que tenía que especificar AllowOverride Allen mi <Directory>bloque en httpd.conf. Sin esto, Apache a veces ignora su .htaccess.

El mío terminó luciendo así ...

<Directory "D:/Dev">
    Options FollowSymLinks Indexes
    #### NEXT IS THE CRUCIAL LINE ####
    AllowOverride All                  
    Order deny,allow
    Allow from 127.0.0.1
    Deny from all
    Require all granted     
</Directory>
Simon East
fuente
En Debian GNU / Linux 7.6, encontré que esta respuesta proporcionó parte de lo que se requería, además de habilitar el módulo para apache2 (a2enmod rewrite).
Kevin Buchs
6

Podrías intentar mudarte root/public/.htaccessa root/.htaccessy debería funcionar

Wasim A.
fuente
4
Publicaste exactamente la misma respuesta a 8 preguntas. Si cree que son duplicados, debe marcarlos como tales y no publicar una respuesta para cada uno.
Jaap
5

Rutas

Úselos para definir rutas específicas que no son administradas por controladores.

Controladores

Úselos cuando desee utilizar la arquitectura MVC tradicional

Solución a tu problema

No registra controladores como rutas a menos que desee una ruta 'nombrada' específica para una acción de controlador.

En lugar de crear una ruta para las acciones de sus controladores, simplemente registre su controlador:

Route::controller('user');

Ahora que su controlador está registrado, puede navegar http://localhost/mysite/public/usery get_indexse ejecutará.

También puede registrar todos los controladores de una vez:

Route::controller(Controller::detect());
David Barker
fuente
3

No olvide el " RewriteBase" en su public/.htaccess:

Por ejemplo :

Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public
Mathieu Perino
fuente
¿Dónde pones esto en el archivo?
Goddard
3

Bien, después de golpearme la cabeza con este problema durante un poco más de un día ... me levanté e hice lo que DEBÍ haber hecho ayer, ¡y DEPURÉ lo que estaba pasando!

Lo que Laravel está INTENTANDO hacer aquí es insertar el archivo index.phpjusto en frente de la ruta dada como Ruta. Entonces, por ejemplo, si especificó a Route::get('/account/create', ...,y ejecutó su aplicación desde decir localhost/laravel/authenticate/public/account/createen su navegador, entonces laravel quiere ejecutar localhost/authenticate/public/index.php/account/create, pero para hacer eso ... Apache necesita ver esas solicitudes /wamp/www/laravel/laravel/authentication/public(su ruta puede variar un poco, dependiendo de dónde la aplicación laravel está realmente instalada, pero el final publices donde debe realizarse la sustitución) debe tener una 'RewriteRule' aplicada.

Afortunadamente, laravel proporciona la regla de reescritura correcta en un .htaccessarchivo útil en la publiccarpeta de tu aplicación . El PROBLEMA es que el código en ese archivo '.htaccess' no funcionará con la forma en que WAMP está configurado de fábrica. La razón de esto PARECE ser el problema sugerido por muvera en la parte superior de este hilo: el código rewrite_module debe ser cargado por Apache antes de RewriteRuleque funcione. Diablos, esto tiene sentido.

La parte que NO tiene sentido: simplemente stoppingy restartinglos servicios de Apache no recogerán los cambios necesarios para que WAMP haga lo correcto con su RewriteRule. Lo sé, ¡lo intenté muchas veces!

¿Qué funciona? Realice los cambios sugeridos por muvera (ver parte superior del hilo) para cargar los módulos correctos. Luego, reinicie toda su sesión de Windows, eliminando así Apache de la memoria por completo. Reinicie (recargue) WAMP y VOILA! la corrección funciona, se aplica la regla RewriteRule correcta, yada, yada; Estoy viviendo feliz para siempre.

La buena noticia de todo esto: Yo sé mucho más acerca de .htaccess, RewriteRuley httpd.confarchivos ahora. Existe un buen argumento (de rendimiento) para mover la lógica del public .htaccessarchivo de su aplicación y ponerla en una Directory ...sección de su httpd.conf en su carpeta Apache 'bin' BTW (especialmente si tiene acceso a esa carpeta).

mdg
fuente
0

Intente habilitar etiquetas php cortas en su php.ini. WAMP los tiene apagados por lo general y laravel los necesita.

dajavax
fuente
¿Esperar lo? ¿Laravel necesita etiquetas cortas?
obispo
0
Route::get('/', function()
{
return View::make('home.index');
});

Route::get('user', function()
{
return View::make('user.index');
});

cambiar arriba a

Route::get('user', function()
{
return View::make('user.index');
});

Route::get('/', function()
{
return View::make('home.index');
});

Tienes que usar '/' (inicio / predeterminado) al final de tus rutas

Athula
fuente
0

debes estar usando Laravel 5 el comando

  class User_Controller extends Controller {
  public $restful = true;
  public function get_index(){
  return View('user.index');
  }
  }

y en route.php

  Route::get('/', function()
  {
  return view('home.index');
  });

  Route::get('user', function()
  {
  return view('user.index');
  });

Cambios en el comando de Laravel 5 para la vista y el controlador, consulte la documentación. Tenía el mismo error antes

Rohan Kalra
fuente
0

Simplemente ejecute en su terminal.

 composer dump-autoload
Bakhtawar Gill
fuente
0

Creo que ha eliminado el archivo .htaccess predeterminado dentro de la carpeta pública de laravel. cargue el archivo, debería solucionar su problema.

jewelhuq
fuente
0

Si está utilizando Vagrant a través de Homestead, es posible que haya un error al montar la carpeta compartida. Parece que Vagrant toma sus archivos de esa carpeta e intercambia los archivos que realmente están en la máquina host en el arranque, por lo que si hubo un error, esencialmente está tratando de acceder a su instalación de Laravel desde la primera vez que lo hizo (que es por eso que solo obtiene "casa", que se generó durante la instalación).

Puede verificar esto fácilmente ingresando a su vm y verificando el archivo routes / web.php para ver si realmente es su archivo. Si no es así, salir fuera y vagrant halt, vagrant upy buscar errores en el arranque.

Giovanni Orlando
fuente
0
  1. configuración del archivo .env
  2. configurar index.html
  3. asegúrate de tener .htaccess
  4. sudo service apache2 restart

lo más probable es que se deba a problemas de caché

Abhi
fuente
0

El principal problema de que la ruta no funciona es que hay un módulo mod_rewrite.so en macos, linux no está habilitado en el archivo httpd.conf de la configuración de apache, por lo que .htaccess puede funcionar. He resuelto esto quitando el comentario de la línea:

# LoadModule rewrite_module libexec/apache2/mod_rewrite.so

Quite la #línea de arriba de httpdf.conf. Entonces funcionará.
¡disfrutar!

Pramod yadav
fuente