Dominio diferente para la sección del sitio web

7 minutos de lectura

avatar de usuario
Olemak

Hay dos sitios web, llamémoslos a.com y b.com; han estado completamente separados hasta ahora. Sin embargo, hay “sinergias”, por lo que el cliente quiere que b.com forme parte de a.com (misma biblioteca multimedia, usuarios, host, base de datos, etc.)… pero con su propio dominio y diseño. Un sitio dentro del sitio, con su propio dominio.

Entonces, básicamente: cuando un usuario va a una parte específica del sitio, digamos a.com/b, la URL debería cambiar a b.com.

Creo que puedo resolver esto con servidores virtuales apache; Encontré esta respuesta sobre cómo hacerlo con Yii: asignar un dominio diferente solo para dos controladores

Pero estoy usando WordPress (ya hice el sitio principal), por lo que debería ir con PHP estándar y ajustes de Apache. Todos los consejos y sugerencias son bienvenidos.

tenga en cuenta: No se trata de multisitio, ya que anularía los beneficios de una galería de medios y usuarios comunes, etc.

Si desea utilizar una sola instalación de WordPress, desea ejecutar WordPress Multisite (lo que parece que no desea hacer) con un complemento de mapeo de dominio, o luego hacer que WordPress acepte cualquier solicitud de nombre de host (dominio) para operar y servir contenido condicionalmente en cada dominio.

(Lo siguiente asume que usted controla ambos example.com y secondary.com y ambos apuntan al mismo servidor donde vive la instalación de WordPress. Además, los siguientes ejemplos se han sacado directamente de mi cabeza sin ninguna prueba o validación real involucrada, puede o no funcionar como está).

Hacer que WP acepte múltiples nombres de host para solicitudes

Normalmente, WordPress está vinculado a un solo nombre de host/dominio donde puede servir páginas y contenido. El dominio se almacena en el wp_options siteurl y home filas como http://www.example.com por ejemplo.

Puede anular esto en wp-config.php usando el WP_SITEURL y WP_HOME constantes PHP. Primero debe asegurarse de que el dominio principal (por ejemplo, maindomain.com) esté configurado correctamente para el wp_options filas de la tabla siteurl y home. Entonces necesitas ajustar el wp-config.php archivo para hacer que WP acepte cualquier dominio como tal:

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);

(Asegúrese de ajustar entre HTTP y HTTPS si es necesario.

Ahora su instalación de WP debería abrirse bien cuando un dominio apunta al servidor. Puede tener tantos dominios como desee y todos hacen que WP se cargue cuando se accede a ellos.

Redirigir una página a otro dominio

Puede usar el código .htaccess o WP para hacer redireccionamientos. Si la redirección es específica de la aplicación/sitio y debería funcionar en cualquier lugar, intente usar el código WP, ya que es más probable que siga en los repositorios de código fuente y demás.

add_action('template_redirect', function () {
    $isMainDomain = strpos($_SERVER['REQUEST_URI'], 'example.com') !== false;

    // We are on primary domain and on domain.com/b
    if ($isMainDomain && is_page('b')) {
        wp_redirect('http://secondary.com');
        exit;
    }

    // You need to validate child pages too and redirect where needed.
});

Agregue eso a un complemento o un tema functions.php. Ahora cuando alguien está accediendo a la página b en el dominio principal, serán redirigidos a secondarydomain.com.

Para lograr esto con un .htaccess, puede intentar lo siguiente

RewriteEngine on
RewriteBase /

// Redirect page `b` and all child pages to other domain.
RewriteCond %{HTTP_HOST} example.com$
RewriteRule ^b/(.*)$ http://www.secondary.com/$1 [L,QSA,R=301]

Eliminar el slug de la página de una página en WP

Ahora tienes un usuario sentado en http://www.secondary.compero el usuario ve la página principal de su instalación de WP en lugar del contenido de la página b.

Con las reescrituras de .htaccess, puede enviar esas solicitudes de dominio a un determinado “subdirectorio” si lo necesita.

RewriteEngine on
RewriteBase /

# Something like the following should hide the `b` page/dir from requests.
RewriteCond %{HTTP_HOST} secondary.com$
RewriteRule ^(.*)$ http://www.secondary.com/b/$1 [L,QSA]

Esa regla primero verifica si la solicitud fue contra la secondary.com nombre de dominio. Si lo fuera, el servidor reescribe todas las solicitudes a la página de WordPress b y sus subpáginas.

Ahora cuando alguien abre http://www.secondary.com debe mapear a http://www.secondary.com/b y mostrar la página en su lugar.

(Nota: no probé la regla anterior, por lo que puede o no funcionar como está.

Arreglando enlaces permanentes

Ahora tienes un problema con los enlaces permanentes con respecto a la página. b. Obtener el enlace permanente devuelve http://www.example.com/bcuando debe volver http://www.secondary.com en cambio.

Agregar un filtro para enlaces permanentes debería solucionar ese problema:

add_filter('post_link', function ($link, $post) {
    if (is_admin()) {
        // Don't change in admin, or editing pages may break
        return $link;
    }

    // Check here that if the $post is either page `b`
    // or a child of that page
    // then return the proper link instead.
    return 'http://www.secondary.com/foo/bar';
});

Este es un enfoque superficial que no considera cómo se comportan los medios o los usuarios. Debe validar que ambos dominios permitan solicitudes de origen cruzado y que las cookies de sesión de usuario se guarden correctamente para sesiones de origen cruzado cuando sea necesario.

Lo que también sugeriría es investigar cómo conectarse al proceso de carga de medios para hacer que dos instalaciones de WP usen el mismo directorio y datos. El mismo directorio se puede lograr con el upload_dir filtro y los archivos adjuntos se guardan de manera similar a las publicaciones para que pueda duplicar las cargas en dos sitios usando wp_insert_post o similar supongo.

Además, puede usar dos instalaciones de WP con una sola tabla de usuarios usando algunos wp-config.php astucia.

  • el código no probado RewriteRule ^(.*)$ http://www.secondary.com/b/$1 [L,QSA] de hecho por alguna razón me redirige “demasiadas veces” a secundario.com/b/b/b/b/b/b

    – Fanky

    21 de octubre de 2019 a las 8:44

  • Se solucionó el problema mencionado anteriormente, pero secondary.com aún muestra la página de inicio. Vea el problema aquí en detalle: wordpress.stackexchange.com/questions/350920/…

    – Fanky

    21 de octubre de 2019 a las 9:59

avatar de usuario
Shomz

Entonces, básicamente: cuando un usuario va a una parte específica del sitio, digamos a.com/b, la URL debería cambiar a b.com.

Parece que solo necesita crear un archivo/controlador/publicación ubicado en a.com/b que redirigirá el navegador a b.com.

La forma más simple es hacer un directorio llamado b en la raíz, y coloque el archivo predeterminado de apache allí (index.htm, index.php, etc.), y ese archivo tendría un encabezado de redirección.

La forma ideal de hacerlo es poner una redirección 301 usando .htaccess. Algo como

Redirect 301 /b http://b.com

o con un comodín:

RedirectMatch 301 /b(.*) http://b.com/$1

(hay toneladas de recursos htaccess en línea)

Esos son los dos extremos, y hay muchas otras opciones en el medio, debe elegir la que mejor se adapte a sus necesidades en función de la cantidad de redirecciones que haya, si hay algún patrón, le gustaría poder generarlos dinámicamente, etc. .


Los problemas que podría tener aquí (nunca describió el problema completamente, así que solo digo), es en caso de que quiera volver a a.com y no pueda configurar una redirección similar en b.com. En ese caso, le sugiero que simplemente diga en a.com/b mientras tiene b.com renderizado dentro de un iframe.

Si no quieres meterte con los filtros de wp o tus reglas de htaccess

Simplemente puede crear un index.html dentro de un directorio llamado /b/ o crea una página con un slug con valor ‘b’ a.com/b con este código en html simple

<script>top.location='http://b.com'</script>

Simplemente agregue un aviso © en la parte inferior de b.com para que forme parte de a.com (o simplemente agregue “Este sitio es parte de a.com” o algo así). Si desea vincular a.com a b.com, agregue un enlace como
b.com
. En caso de que desee un nombre de dominio dentro de a.com, simplemente haga una redirección de a.com/b a b.com…

¿Ha sido útil esta solución?