El servidor WEB Apache ofrece un módulo el cual permite tener URL’s amigables, este es conocido como el mod_rewrite.

Muchos de los frameworks basados en PHP hoy en día toman ventaja del mod_rewrite para construir su patrón URL tipo MVC (Modelo-Vistas-Controlador) por ejemplo: CodeIgniter, Zend Framework, CakePHP entre otros.

Existe una configuración de este módulo el cual permite predefinir cual es el URL base en donde los archivos finales deben ser cargados, esta configuración es conocida como el RewriteBase. Una limitante es que solo se puede definir una sola vez en el .htaccess.

Muchos desarrolladores utilizan diferentes servidores como parte del ciclo de vida del proyecto, por ejemplo un servidor para Desarrollo (DEV), otro para Pruebas (STAGE) y el final de producción (PROD). En muchas ocasiones la URL del proyecto puede variar en base a este servidor lo cual presenta un problema para el uso del mod_rewrite de apache.

La solución: crear una variable que almacena la ruta por servidor y luego utilizar esta variable en la definición de la regla RewriteRule.

Aquí les dejo con el código que puede utilizar para soportar diferentes RewriteBase en base al nombre del servidor. Esto debe estar en el .htaccess al mismo nivel del root del proyecto.

# Activation of the URL Rewriting
Options +FollowSymlinks
RewriteEngine On

# RewriteBase equivalent - Production
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule . - [E=REWRITEBASE:/]

# RewriteBase equivalent - Staging / Test Server
RewriteCond %{HTTP_HOST} ^stage\.example\.com$
RewriteRule . - [E=REWRITEBASE:/client/project/]

# RewriteBase equivalent - Local / Development
RewriteCond %{HTTP_HOST} ^localhost$
RewriteRule . - [E=REWRITEBASE:/client/project/website/v1/]

# Rewriting
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ %{ENV:REWRITEBASE}index.php?page=$1 [L]

Enlaces de referencia: