Instalación de OpenCms en Contextos Diferentes a ROOT

Aprende a configurar OpenCms en contextos distintos a ROOT para eliminar “contexto/opencms” de tus URLs, con guías prácticas y consejos de expertos en la materia.

01 abril 2024
Ramón Gavira Sáenz
En la documentación oficial de OpenCms, explican muy clarito como podemos configurara un frontal apache para deshacernos del "opencms" en nuestras Rutas. El contexto lo eliminan instalando en ROOT, pero... y si no puedo instalar en ROOT. En este articulo vamos a exponer una caso bastante habitual y que muchas veces es un quebradero de cabeza.

Objetivo, nuestra instalacion

Cuando desplegamos sin mas los archivos de instalacion de opencms, el fichero war de la instalacion es opencms.war, cuando desplegamos tal cual, la aplicacion se nos instala en un contexto "opencms" de esta forma directamente por tomcat accederiamos a la aplicacion haciendo http://miservidor:8080/opencms/opencms/system/login 

Por otro lado si creamos un site, lo logico es que quedamos que corresponda a un dominio por el puerto 80, por ejemplo:

http://midominio.com

Además, querremos tambien que nuestras url no incluyen /opencms/opencms/

Para hacer esto, podemos usar un frontal apache que conecte con tomcat mediante el puerto AJP como se explica en la documentacion oficial:  Apache proxy configuration (opencms.org)

El problema es que esta configuracion solo funciona si tenemos opencms instalado como ROOT en nuestro servidor de aplicaciones. 

 

¿Cómo lo hacemos si opencms esta instalado en una contesto diferente a ROOT?

La forma de eliminar el segundo /opencms/ del path: /opencms/opencms/ es relativamente sencilla, os adjunto la configuración. 

Es importante que contexto y aplicacion tengan distinto nombre, si no las reescrituras serían bastante complejas.  En nuestro ejemplo el despliegue estaría en: 

/var/lib/tomcat9/webapps/opencmsctx nuestro contexto sería opencmsctx y la aplicacion opencms.

Queremos eliminar /opencmsctx/opencms/ de nuestros paths: 

Asi quedaria el VirtualHost:

<VirtualHost *:80>
    ServerName ocms.miservidor.com
    ServerAlias sitio.miservidor.com
    ServerAdmin webmaster@miservidor.com
 
    # 1. Usamos el directorio de despliegue de opencms como DocumentRoot
    DocumentRoot /var/lib/tomcat9/webapps/opencmsctx
 
    # 2. Permitimos a apache acceder a las carpetas exports y resources
    <Directory /var/lib/tomcat9/webapps/opencmsctx/export>
        Options FollowSymlinks
        Order Deny,Allow
        Allow from all
        Satisfy any
    </Directory>
 
    <Directory /var/lib/tomcat9/webapps/opencmsctx/resources>
        Options FollowSymlinks
        Order Deny,Allow
        Allow from all
        Satisfy any
    </Directory>
 
    # 3.(opcional) Configuracion de logs
      ErrorLog /var/log/apache2/opencms.error.log
      CustomLog /var/log/apache2/opencms.access.log combined
      LogLevel trace3
 
 
    # 4. habilitamos Reescritura e  indica que Apache debe mantener el encabezado Host original de la solicitud HTTP cuando la reenvía al servidor de destino
    RewriteEngine On
    ProxyPreserveHost On
 
 
 
    # 5. (Opcional) Se deniega la ejecucion de php
    RewriteCond %{REQUEST_FILENAME} (.+)\.php(.*)
    RewriteRule (.*) / [F]
 
 
    # 6. Se añade el prefijo cuando sea necesario
    RewriteCond %{REQUEST_URI} !^/opencmsctx/.*$
    RewriteCond %{REQUEST_URI} !^/workplace.*$
    RewriteCond %{REQUEST_URI} !^/VAADIN/.*$
    RewriteCond %{REQUEST_URI} !^/resources/.*$
    RewriteCond %{REQUEST_URI} !^/export/.*$
    RewriteCond %{REQUEST_URI} !^/webdav.*$
    RewriteRule !^/opencmsctx/opencms/(.*)$ /opencmsctx/opencms%{REQUEST_URI} [PT]
 
    # 7. Regla para la exportacion estatica
    RewriteCond %{REQUEST_URI} ^/export/.*$
    RewriteCond "%{DOCUMENT_ROOT}%{REQUEST_FILENAME}" !-f
    RewriteCond "%{DOCUMENT_ROOT}%{REQUEST_FILENAME}/index_export.html" !-f
    RewriteRule .* /opencmsctx/handle404?exporturi=%{REQUEST_URI}&%{QUERY_STRING} [PT]
 
 
 
    # 8. Conectamos con tomcat usando proxy_ajp
    ProxyPass /handle404        ajp://localhost:8009/opencmsctx/handle404
    ProxyPass /opencms          ajp://localhost:8009/opencmsctx/opencms
    ProxyPass /export           ajp://localhost:8009/opencmsctx/export
    ProxyPass /webdav(.*)       ajp://localhost:8009/opencmsctx/webdav$1
    ProxyPass /VAADIN           ajp://localhost:8009/opencmsctx/VAADIN
    ProxyPass /workplace        ajp://localhost:8009/opencmsctx/workplace
    ProxyPass /opencmsctx       ajp://localhost:8009/opencmsctx
 
# 9.  rRescribir los path de las cookies en las respuestas del servidor de destino antes de enviarlas de vuelta al cliente
    ProxyPassReverseCookiePath /opencmsctx /
</VirtualHost>

 

Como quitamos opencmsctx

Efectivamente en el punto en el que estamos opencmsctx sigue apareciendo en las rutas que genera opencms, de modo que cuando navegamos nos encontramos con errores 404 por todos lados.

Para solucionar eso hay que modificar el fichero de configuracion opencms-importexport.xml localizar esta entrada:

                <rendersettings>
                    <rfs-prefix>${CONTEXT_NAME}/export</rfs-prefix>
                    <vfs-prefix>${CONTEXT_NAME}</vfs-prefix>

y sustituirla por esto:

                <rendersettings>
                    <rfs-prefix>export</rfs-prefix>
                    <vfs-prefix></vfs-prefix>

Así modificamos la forma en la que opencms generará las rutas online y no incluirá el contexto.

 

Espero que os ayude.