Problemas de la ruta de reescritura de mod.

He creado con éxito reglas de reescritura para manejar URL como

http://example.com/xyz

http://example.com/xyz/

http://example.com/xyz/abc

http://example.com/xyz/abc/

Aquí está el mod rewrite & regex:

Options +FollowSymlinks RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/?([0-9]+)(?:\/)?$ /index.php?p=$1 [L] RewriteRule ^/?([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1 [L] RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$2 [L] 

Esto funciona muy bien, pero el problema es que cuando voy a http://example.com/xyz/abc , mi script obtiene la entrada correcta (n = abc) pero las rutas están desordenadas, por lo que todas las URL relativas en mi código están rotos, ya que ahora son relativos a xyz en lugar de la raíz.

¿Hay alguna forma de evitar esto? Como puede ver arriba, he intentado redirigir a /index.php para forzar que la ruta sea correcta. Mi cerebro está frito después de un largo día de expresión regular y código, así que espero que no sea algo desastrosamente trivial.

Las tres opciones son:

1) Use una etiqueta base (esto afectará a cada URI relativo en su página, incluidos enlaces, imágenes, scripts, hojas de estilo, etc.)

  

2) Cambie todos sus enlaces a URI completamente calificados

  

3) Use el prefijo “/” para mostrar que la ruta es relativa a la raíz en cada URI.

  

Personalmente, he usado la opción de etiqueta base más, lo que me da una mala impresión (de personas que la han usado sin entenderla realmente). Cuando se trata de mod_rewrite, la etiqueta base es perfecta, ya que probablemente QUIERES que todas tus rutas sean relativas a la raíz, incluidas todas tus imágenes, css, scripts y enlaces.

Use el elemento base HTML para forzar a todas las URL relativas a usar una ruta diferente a la que muestra el navegador.

  ... link 

La URL relativa usará ” http://www.example.com ” como su base, incluso si el navegador cree que está mirando la página ” http://www.example.com/xyz/ “. Así que el enlace va a ” http://www.example.com/https://stackoverflow.com/questions/1755826/mod-rewrite-path-issues/relative/url ” en lugar de ” http://www.example.com/xyz/https://stackoverflow.com/questions/1755826/mod-rewrite-path-issues/relative/url

Y existe la forma de hacerlo de Stack Overflow, en la que cada URL es una ruta absoluta (a recursos como imágenes) o rutas que incluyen la raíz (es decir, “/ feeds / questions / 123”), que evitan los problemas de ruta relativa.

Edición: Supongo que está hablando de URL en su código HTML, por ejemplo, a imágenes y hojas de estilo, que están rotas.

No, por lo que sé, no hay forma de evitarlo, porque el navegador ve una ruta y solicita recursos relacionados con ella. No tiene nada que ver con el servidor, y no hay nada que puedas hacer.

Tendrá que recurrir a un divisor diferente que no se interprete como un divisor de directorio (por ejemplo, guiones bajos), o usar rutas absolutas, o usar la etiqueta . Sin embargo, nunca he usado la etiqueta base, y no está muy bien considerada donde se mire. Lo mejor sería probablemente cambiar a caminos absolutos.

modifica tu última RewriteRule para incluir la ruta. Tienes el camino en la expresión regular.

 RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ $1/index.php?n=$2 [L] 

o alternativamente (dependiendo de lo que está tratando de lograr):

 RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1/$2 [L] 

Intenté usar el elemento BASE en mis páginas como acceso directo en lugar de cambiar todas las direcciones URL. Agregue el elemento base de la siguiente manera:

  

Y aquí están los resultados:

 This:  Becomes:  This:  Becomes:  This:  Becomes:  This:  Becomes:  

Siempre puede anular la etiqueta base cuando sea necesario:

 This:  Remains:  This:  Remains: