2011-07-20 13 views
12

Estoy trabajando en una aplicación que usa reescrituras de URL y tiene una configuración .htaccess específica. Cuando se trabaja en la aplicación tengo tres eviorments:.htaccess entre developemt, staging y producción

  1. developent en mi máquina local (localhost)
  2. Staging (staging.mydomain.com)
  3. Producción (www.mydomain.com)

Estoy constantemente impulsando nuevas actualizaciones al entorno de producción y producción y cada vez que sobrescribo el código fuente existente tengo que ir a cambiar el archivo .htaccess. ¿Hay alguna manera de que el .htaccess sea genérico para el directorio o haga que detecte automáticamente su entorno?

Mi archivo .htaccess actual está por debajo. Acabo de dejar de comentar las secciones entre los diferentes entornos, pero me encantaría dejar de hacerlo ...

# Development 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 

# RewriteEngine on 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_URI} !=/favicon.ico 
# RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 

# RewriteEngine on 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_URI} !=/favicon.ico 
# RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 

¡Gracias de antemano!

Chuck

+0

¿Por qué las rutas son diferentes, pero /favicon.ico es el mismo? –

+2

Acabo de configurar hosts virtuales para que tenga las mismas URL en cada entorno. Entonces no necesitarías cambiar el .htaccess entre ellos. – Quentin

Respuesta

13
# Development 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^localhost 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^staging.mydomain.com 
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^www.mydomain.com 
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 
+0

¿Es la variable obsoleta '% {REQUEST_HOST}'?Solo encontré el equivalente '% {HTTP_HOST}' en la documentación de mod_rewrite. –

+0

@JohnnyWong, sí, parece que sí: https://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond actualizó la respuesta con la varilla 'HTTP_HOST'. No dude en editar la respuesta en caso de que encuentre algún otro problema, ya que no uso Apache desde 2011, creo;) –

7

Una opción sería la de las variables de entorno de configuración en httpd.conf (o en otro lugar) que definen su entorno.

Por ejemplo (en httpd.conf):

SetEnv ENVIRONMENT production 

(en .htaccess)

RewriteEngine on 

# Development 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = development 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = staging 
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = production 
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 

no probado, pero creo que el concepto es lo suficientemente sólidas como para averiguar cualquier problema ;-)

+0

+1 Genial si tiene acceso a Apache conf porque puede configurar el entorno independientemente de lo que URL es. Hace que el desarrollo local en el que utilice una URL diferente para los servidores alojados sea mucho más fácil – Precastic

0

Chuck D, la variante de Dumitru Ceban es muy buena. Pero te sugiero que intentes también la opción de tener alguna bandera en tu código, no en .htacces.

Además, buena sugerencia de rudi_visser. Pero quiero agregar aquí, que en el sistema ideal solo deberíamos usar apache`s * .conf y rechazar .htaccess (solo un desempeño estúpido).

Así que le sugiero que tenga un indicador en el código, evite .htacess (si puede) y cambie env. por simple valor de confirmación o por alguna lógica como if locaslhost == host then ...

+0

O, para un sistema ideal, solo podríamos usar - *. Conf en producción. – gaRex

+0

¡No creo que el rendimiento de .htaccess en los sistemas modernos sea algo de lo que preocuparse! Pero de todos modos no creo que poner esta lógica en el código ayudaría en esta situación debido al hecho de que Apache no sabrá dónde enrutar las solicitudes de todos modos. –

+0

@rudi_visser, no estoy seguro de que .htaccess sea adecuado en producción. Y PHP podría saber dónde pasar qué lógica dentro de su marco: qué conexión DB de tmp/pathes usar. – gaRex

1

¿No puede simplemente colocar sus archivos .htaccess en cada uno de los entornos, y luego simplemente ignorar el archivo en cualquier FTP o implementar el programa que está utilizando?

Alternativa, lo que hago es configurar VirtualHosts en mi host local que es el mismo dominio que el sitio de producción, pero con un prefijo dev.. Por ejemplo, www.example.com y dev.example.com. De esa manera, siempre puedo estar seguro de que la raíz es el directorio de nivel superior del host que estoy usando, sin importar el entorno; y no necesito volver a escribir mis directivas .htaccess.

Cuestiones relacionadas