No funciona nada de lo que hago con Rewrite (.htaccess)

Iniciado por Poliformado, 11 Febrero 2012, 17:05 PM

0 Miembros y 1 Visitante están viendo este tema.

Poliformado

Saludos, mi problema es que he intentado hacer que mis archivos .php salieran sin extensión en la url, todo esto obviamente mediante .htaccess y con el modulo Rewrite activo. Este seria el resultado que estaba intentando lograr:

http://localhost:8080/Zero%20Proyect/index.php < Formato con extensión.

http://localhost:8080/Zero%20Proyect/index/ < Formato sin extensión.

Nada de lo que he intentado para conseguirlo ha dado resultado y ya extrañado he empezado a buscar recursos por internet, ejemplos ya hechos de gente que explicaba como funcionaba cada parte del código propuesto y su resultado, inclusive viendo vídeos de Youtube en ingles y castellano de como hacer para que saliera sin extensión.

Durante el día me he dedicado a formarme en lo básico necesario para trabajar con .htaccess y como formar patrones de expresiones regulares, aun no entiendo algunas cosas, pero llevo ya investigado bastante como para reconocer que no funciona con normalidad.

Estoy usando un servidor local instalado con WampServer 2.2, el servidor apache en su versión 2.2.21 y el archivo .htaccess se encuentra en el directorio raíz del sitio web que estoy preparando en modo local.

Uno de los múltiples ejemplos que he usado por probar ha sido el siguiente:

<IfModule mod_rewrite.c>
# Activar RewriteEngine
RewriteEngine on
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^(.*)$ $1.php
</IfModule>


Por ultimo me gustaría destacar que he buscado ya a ultima hora por google un buen rato y por diversas palabras clave (en ingles y castellano) si había alguien más con mi mismo problema, seguro que de haberlo existirá, pero en mi caso no lo he hallado todavía.

Gracias por vuestro tiempo con la lectura, saludos.

#!drvy

Si usas WampServer, deduzco que usas Windows. Windows y los archivos .htaccess no se llevan muy bien en un principio xD. Primero por el . delante y luego porque en apache suele venir desactivado.

Comprueba que en tu http.conf, donde esta tu directorio www tienes estas dos opciones de esta forma:

Código (apache) [Seleccionar]
   Options FollowSymLinks
   AllowOverride All


Si alguna esta puesta de otra forma (o no esta directamente), ponlas.

Saludos

Poliformado

Hola drvy, te agradezco mucho tu respuesta, he mirado lo que me comentaste y el AllowOverride All lo modifique antes de este tema por que lo vi en un hilo ingles que trataba algo parecido, sobre Options FollowSymlinks me lo encontré con un Indexes entre medias de Options y FollowSymlinks, lo modifique por si acaso.

Guarde todo y a noche me puse a investigar por que seguía ignorando los patrones el .htacces, creo que no las ignora del todo, al menos hasta lo que llevo visto. Buscando sacarle un error que me diese la ruta hice esto:

<IfModule mod_rewrite.c>
# Activar RewriteEngine
RewriteEngine on
RewriteBase /Zero%20Proyect
RewriteRule ^(.*).php$ $1
</IfModule>


Una screen del efecto: imagen

Con esto pude comprobar que efectivamente ignorarlo no lo ignora del todo, pero si pongo un RewriteRule que esta bien escrito y debería funcionar, lo ignora y la ruta no la cambia a su versión sin extensión "/Index". El RewriteBase esta hecho aposta solo para la ocasión, realmente lo tengo con la barra "/" y muestra /index.

He seguido intentadolo construyendo mi propio patrón, pero el resultado ha sido negativo hasta ahora, excepto por ciertas pruebas como esta otra:

<IfModule mod_rewrite.c>
# Activar RewriteEngine
RewriteEngine on
RewriteBase /
RewriteRule ^(.*).php$ /$1.php
</IfModule>


Una screen del efecto: imagen

Me saca al index del localhost y es curioso por que todas las rutas me las muestra como "Zero Proyect/ruta" incluido cuando accedo a otros proyectos, pero cuando accedo al proyecto web donde esta el .htaccess me devuelve "http://localhost:8080/Zero Proyect/Zero Proyect", cuando el .htaccess esta en la carpeta raiz del Zero Proyect, no en el localhost.

Gracias por tu ayuda drvy, ojala entre las aportaciones saquemos el problema adelante. Yo seguiré probando con los patrones para ver si saco algo más en claro.

Un saludo.

Poliformado

#3
Vale, soy consciente que estoy respondiendo de nuevo a mi hilo, no obstante lo hago en calidad de actualizar con novedades a la causa y explicar así los nuevos resultados y no con animo de bumpear el tema. Gracias. :)

Primero de nada gracias Drvy nuevamente por ayudarme con lo que me comentaste dado que debido a eso me distes una idea la cual ha dado resultados favorables, pero no han solucionado del todo el problema base, solo lo ha esclarecido un poco más.

Después de escribir lo que le comentaba a Drvy aquí en respuesta a su ayuda, seguí investigando con los patrones, intentando sacar la ruta, errores y cualquier cosa que me pudiese ayudar.

Esto puede ser algo largo, pero para quienes puedan ayudar o puedan ser ayudados en el futuro con un problema de esta índole, creerme, merece la pena seguir leyendo.

Resulta que hable en la respuesta anterior de las rutas, si efectivamente, había algo raro en las rutas. Lo primero que hice fue cambiar el nombre de la carpeta "Zero Proyect" por "zero" para evitar problemas por el espacio o las mayúsculas, entonces me encontré con que la ruta mostraba un "http://localhost:8080/zero/zero" y aparecía el index.php del WampServer.

La conclusión a esto fue mayúscula cuando lo vi, resulta que hasta ahora la ruta que había estado tomando el .htaccess era la que WampServer le suministraba de forma absoluta y no la del url.

¿Cual era esa ruta absoluta? obviamente la que empieza por mi unidad de disco duro donde tengo alojado el proyecto y termina en /www/ hasta el "index.php" del wampserver, por lo tanto por eso aparecía el index.php y por eso /zero/ era intercambiado por el .htaccess en la url dando por existente el index.php que yo buscaba a través del .htaccess.

Cambie la ruta añadiendo como absoluta la del proyecto en el wampserver, ahora si o si era el index.php de mi proyecto, entonces ¿Que debía salir mal? el patrón de expresión regular.

Hasta aquí he llegado, estoy aun haciendo pruebas, pero por lo que llevo visto ningún patrón de los que circula por la red explicando que limpia la extensión .php han servido para realizar su función.

Por lo demás lo probado hasta ahora con expresiones regulares me han llevado a las siguientes errores y sus consecuentes conclusiones:

1º Las expresiones usadas por la red y que he probado han sido ignoradas por completo, no han tenido efecto o han dado como resultado un Internal Server Error. Para asegurarme he probado primero el codec usado por el archivo .htaccess y si, esta en UTF-8, he probado en otros pero no ha sucedido nada o simplemente ha dado Internal Server Error.

2º Las expresiones que he hecho mediante la ayuda de un libro que tengo de javascript, la información suministrada por microsoft y diversas webs, que explican para que sirven y como se construyen las expresiones regulares, me han llevado a hacer todo tipo de experimentos, para sacar errores simplemente o intentar conseguir parte de la ruta y que un error me mostrara que estaba sacando.

3º La expresión RewriteRule ^(.*).php$ $1.php da como resultado que $1 guarde "index" o cualquier otra parte de la pagina acabada en .php, si quito el .php al (.*).php da Internal Server Error, por lo tanto ya se que tanto el patrón como la ruta han de ir con la extensión sino da error.

4º La expresión RewriteRule ^(([^/]+/)*[^.]+)$ /$1.php [L] no da un error exactamente, sino que es ignorada, curiosamente me he fijado en que las barras "/" dentro de un patrón provocan que este sea ignorado y siga viéndose la pagina tal cual, pero que dependiendo de como se escriban las barras de un Internal Server Error, por ejemplo RewriteRule ^((+/)*[^.]+)$ /$1.php [L].

5º Algunas expresiones probadas y que daban error en la ruta mostrándola, podia verse que realmente estas no eran ignoradas, a continuación los errores de ruta y sus patrones usados:

Muestra: The requested URL /i.php was not found on this server.

<IfModule mod_rewrite.c>
# Activar RewriteEngine
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^(^[a-z])*(.*).php$ $1.php
</IfModule>


Muestra: The requested URL /x.php was not found on this server.

<IfModule mod_rewrite.c>
# Activar RewriteEngine
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^([a-z])*(.*).php$ $1.php
</IfModule>


La conclusión más rápida que puedo sacar de tanta prueba es que $1 en caso de usar (.*).php si toma index.php, pero que intentando que sea solo /index/ no funciona, dado que por lo que parece o creo que es, ambos ruta falsa y ruta verdadera no me las esta diferenciando, sino que requiere que estas sean verdaderas si o si.

Para terminar recomendar el uso del "apache error log", esto me permitió ver algunos fallos y llegar a la conclusión de la ruta absoluta más rápidamente.

Gracias por vuestro tiempo con la lectura, saludos.

#!drvy

#4
Hola,

Lo siento por responderte tan tarde, pero ultimamente ando muy liado de la cabeza por todos lados y solo tengo tiempo para decir chorradas xD

Podrias probar esto ?
Código (apache) [Seleccionar]

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) $1.php [L]
</IfModule>


El resultado debería ser esto (click para agrandar):

PD: No te sorprendas por los marcadores, estoy en el PC de mi novia xD

La diferencia son las condiciones que se le imponen. Por cierto, si no funciona, me podrias mostrar tu http.conf + el apache.log con las ultimas lineas ?


Saludos

Poliformado

Justo a noche cuando te enviaba el p.m probé el mismo código y ahora por si acaso lo he vuelto a probar pero sin resultado. Te he enviado un p.m con lo que me has pedido, esta limpio el apache.log y hecho con la prueba del código que me has pasado.

Un saludo.

#!drvy

Hola,

Cuando dices "sin resultado" te refieres a que te da error o a que no funciona ?

Por cierto, lo que quieres es ocultar la extensión PHP o no mostrarla ?

Me refiero, con ocultar entiendo que quieres que cuando alguien visite sitio.com/php1.php se oculte y le rediriga a sitio.com/php1

Y con no mostrarla me refiero a que directamente visiten sitio.com/php1.


Saludos

Poliformado

#7
Hola drvy, referente a "sin resultado" me explico:

Con lo probado hasta ahora cualquier cosa que hiciera mal con el patrón aposta me daba un Internal Server Error, dando en el error log de apache un aviso del tipo "error al compilar patrón", "La pagina no se encuentra" y viceversa.

Con el patrón que me pasaste por privado, directamente no da nada, ni resultado como error, ni realiza la función el patrón, por no hablar que si meto una re dirección, un bloqueo de acceso a un directorio o cualquier otra cosa después del patrón pues no importa por que directamente no carga el .htaccess, digamos que es como si ignorase la existencia del .htaccess usando el patrón que me pasaste. Igual pasa como te comente con los RewriteCond.

Seria ocultarla drvy, intentaba dejarlo como explicas para un futuro hacer paginaciones o mejorar el SEO de la pagina.

Tengo dos teorías por probar, pero me parece rara una de ellas:

1. Creo que el .htaccess creado en Windows 7 x64 da problemas aun dándole bien el formato y el codec bien, esto lo sostengo por que mi host en Bluehost esta en Linux y le pasa igual que al Wamp. Podría intentar crear el archivo .htaccess en una distribución Ubuntu y probar nuevamente.

2. Me pediste el httpd.conf, tal vez le pase algo y tenga conflictos con windows 7, lo desconozco, pero si esto fuera así creo que hubiese encontrado al menos un caso parecido al mio... No estoy seguro.

Un saludo.

P.s: También se me ha ocurrido que podríamos probar con un .htaccess que hagas en tu pc y con el patrón que me enviaste, lógicamente ese estará bien, mientras así pruebo lo de Ubuntu para descartar ambos casos.

#!drvy

Hola,

Código (apache) [Seleccionar]
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteBase /

# Si el archivo no es un directorio
RewriteCond %{REQUEST_FILENAME} !-d

# "Redirigir" normal cualquier numero,letra y barra (-)
# y no hacer nada mas.
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.php [L]

# Si la consulta tiene extension .php
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.php\ HTTP

# Y no es un directorio
RewriteCond %{REQUEST_URI} !-d

# Rediregimos a la misma consulta sin el .php
RewriteRule ^(.+)\.php$ $1 [L,R=302]

</IfModule>


Ahora, si intentas acceder a sitio.com/archivo.php te redirige a sitio.com/archivo

Y si no, lo muestra tan normal.

También, he solucionado el internal error que tiraba cuando intentabas acceder a un archivo que no existía.

Tambien te dejo el archivo, tal y como por si crees que son problemas con el x64.
Código (url) [Seleccionar]
http://www.drvy.net/wp-content/uploads/2012/02/hta.zip

Saludos

Poliformado

#9
Ha funcionado drvy, el código que me has pasado ha funcionado. Solo queda arreglarlo para que pueda entrar en los directorios con el resto de archivos y demás, pero de eso ya me ocupo yo para ir aprendiendo más.

Muchísimas gracias por todo tu apoyo y por estar a tope conmigo desde el principio, realmente no se si algún día podre pagártelo como es debido, pero si alguna vez estas por Madrid ¡Te invito a comer!

Créeme cuando te digo, me has salvado.

Como comentarios finales al tema hay cosas que desconozco y que supongo de momento quedaran como incógnitas para el que venga detrás, sobre el como y por que, más que nada por que la mayoría de gente usa códigos de patrones como los presentados aquí y como el que me pasaste en otra ocasión les funciona perfectamente, pero extrañamente en mi caso no, como por ejemplo las barras que actuaban de escape total o los RewriteCond, que creo ahora entender que funcionan como los if.

Con esto he de suponer que no todos los patrones son para lo mismo y el que yo estaba usando para mi caso en especial no servia. Como un noob me he estrellado, he malgastado mi tiempo y el de los demás en teorías absurdas, por puro desconocimiento del uso y practica con .htaccess, junto con los patrones de expresión regulares.

Para los que vengan detrás, espero que les sirva todo lo aquí comentado, yo me llevo una sabía lección y espero aprender más sobre expresiones regulares para que no me vuelva a pasar algo así en el futuro.

Un saludo a todos, gracias de nuevo a drvy, a todos los lectores que hayáis seguido el hilo y a los admins del elhacker.net por haber hecho este gran sitio en la red. Suerte para los que lleguen hasta aquí con el mismo problema.