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?


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.


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


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"


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.


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>

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


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());

3

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

Por ejemplo :

Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public

¿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).


0

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


¿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


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



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.



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.


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é


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!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.