Diferentes vistas de tienda o sitios web en subcarpetas


29

Un cliente quiere que su tienda de varios pisos se configure de esta manera:

Este es un ejemplo, pero puede haber muchas más subcarpetas diferentes. ¿Cuál es el mejor enfoque para manejar diferentes subcarpetas para diferentes vistas / sitios web de la tienda?

Sé que una solución es crear subcarpetas llamadas de, enetc. y copiar el index.php y .htaccess en las subcarpetas correspondientes.

También puede haber algunas soluciones (enlaces simbólicos para index.php, configuración de vHost en lugar de usar .htaccess) para minimizar la duplicación de archivos, pero me gustaría encontrar una solución en la que no tenga que hacer ningún cambio en el sistema de archivos, sino solo manejar todo por configuración.


ACTUALIZAR

Verificamos con el soporte de Enterprise que la mejor manera de hacerlo es creando subcarpetas.

Terminamos haciéndolo así:

  • Crear un directorio de "carpetas de idiomas"
  • Creó una copia de index.php dentro del directorio junto con un .htaccess ajustado y enlaces simbólicos a las carpetas de Magento (aplicación /, errores /, ...)
  • Se crearon enlaces simbólicos "de", "en", etc. dentro del directorio raíz de Magento apuntando al directorio "carpetas de idiomas"

De esta forma podemos agregar un nuevo idioma creando un nuevo enlace simbólico (por ejemplo, "fr").


Hicimos esto solo para descubrir que el sitio web no puede encontrar ningún producto o categoría (Magento 404 / sin ruta a la página). ¿Encontraste esto también?
snh_nl

No por lo que recuerdo, lo siento. ¿Volviste a crear todos los índices?
Matthias Zeis

Usamos nginx y es necesaria una actualización de la configuración para que funcione. Actualizaré mi comentario
snh_nl

2 cosas más extrañas 1) / checkout devuelve un 404 y 2) el selector de idioma: si hago clic en inglés, luego vuelvo a hacer clic en inglés, vemos que la uri sigue agregando / en / en / en / etc ... ¿qué elegiste como url base? domain.com/en o didi lo mantienes como
domain.com

Elegimos domain.com/en/.
Matthias Zeis

Respuestas:


18

Es muy fácil servir múltiples dominios / rutas basados ​​en URL. Como se mencionó, la configuración más fácil (solo configuración) es posible cuando los core/storecódigos únicos se pueden usar en la ruta como subcarpetas . Esto requiere uno de los siguientes:

  1. Los visitantes están vinculados a la ruta de subcarpeta correcta inicialmente
  2. Los visitantes reciben una página de destino desde la que seleccionan su tienda y reciben una cookie
  3. Se utiliza algún mecanismo para establecer el tipo de ejecución y el código de ejecución antes de que PHP maneje la respuesta

Con respecto al n. ° 3: desde 1.4 Magento, permitimos que el servidor web determinara el contexto de ejecución ( sitio web o tienda ), así como el código particular que debería usarse. Desde index.php :

/* Store or website code */
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';

/* Run store or run website */
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';

Mage::run($mageRunCode, $mageRunType);

Mientras que las variables de entorno se utilizan para inicializar la aplicación, es posible influir en el sistema incluso antes de que PHP se active. Con Apache y mod_rewriteesto se puede hacer para subcarpetas con un poco de truco:

RewriteCond %{REQUEST_URI} ^/de/$
RewriteRule .* - [E=MAGE_RUN_CODE:deutsch]
RewriteCond %{ENV:REDIRECT_MAGE_RUN_CODE} (.+)
RewriteRule .* - [E=MAGE_RUN_CODE:%1]

Apache es nervioso con las variables de entorno y subcarpetas, como lo demuestra esta excelente respuesta SO . Las dos líneas iniciales dan como resultado $_SERVER["REDIRECT_MAGE_RUN_CODE"] = 'deutsch';mientras que las últimas dos líneas proporcionan lo necesario $_SERVER["MAGE_RUN_CODE"] = 'deutsch';. Hay muchos otros trucos, pero lo anterior me ha mordido antes.

El objetivo final debe ser la detección inicial tanto como sea razonable (geoip + preocupaciones multilingües) mientras se hace que el usuario configure la cookie de la tienda que se puede usar para omitir / pasar por la lógica en solicitudes posteriores.


1
Gracias Ben. Al hacerlo de esta manera, puedo inicializar las visitas a la tienda, pero siempre obtengo la página Magento 404 ("Whoops, our bad"). Establecí la URL base en domain1.org/en , domain.org/de y así sucesivamente. Skin URL, Media URL, etc. están configurados en domain.org/ (skin | media | ...) Tenga en cuenta que se devuelven las páginas correctas si utilizo el enfoque normal "copy index.php and .htaccess".
Matthias Zeis

Acepté esta respuesta, ya que se acerca más a lo que intentamos lograr (incluso cuando la resolvimos un poco diferente para nuestros requisitos especiales).
Matthias Zeis

Realmente sorprendido de que la configuración "Agregar código de tienda a URL" no funcionara.
Benmarks

Los códigos de la tienda deben ser únicos. ¿Cómo debería funcionar con varias vistas de la tienda que terminan en de /, fr / o en /?
Matthias Zeis

Creo que me perdí los códigos de tienda replicados, aunque creo que estaba asumiendo una reescritura basada en un servidor web (por ejemplo mode_rewrite) basada en HTTP_HOST+ nivel de subcarpeta 1.
puntos de referencia

9

Si las URL con sangría (subcarpetas) pueden tener el mismo nombre que los códigos de la tienda (¿por qué no?), Simplemente puede habilitarlas Configuration > Web > Url options > Add Store Code to Urls.


Correcto, entonces ni siquiera necesitará subcarpetas. Mientras la reescritura de URL esté habilitada, Magento sabrá que "en" es un código de vista de tienda y no buscará una subcarpeta.
Paul Grigoruta

8
El problema con esta solución es que Magento solo permite un código de tienda "de" en una instalación de Magento. Entonces, si tiene varios sitios web con los mismos idiomas, debe usar códigos de tienda diferentes, por ejemplo, de_de, de_en, ...
therouv

2
Rouven lo entendió. El problema es que no puede tener varias tiendas con el mismo código de tienda.
Anna Völkl

Sí, el problema es que, como dijo Rouven, no puede tener dos vistas de la tienda utilizando el mismo código de la tienda.
Matthias Zeis

Confirmo que Rouven lo hizo bien. Un error fue reportado a Magento. Porque en estos entornos modernos con más almacenes múltiples esto debería funcionar. Sin embargo, ¿cree que sería posible hacer que la configuración sea Add store codes to urluna vista de tienda? magento.stackexchange.com/questions/60686/… = supongamos que hay 1 multitienda con dominios sep, los otros usos / en y / fr
snh_nl

3

terminamos haciendo exactamente eso

Verificamos con el soporte de Enterprise que la mejor manera de hacerlo es creando subcarpetas.

Terminamos haciéndolo así:

  • Crear un directorio de "carpetas de idiomas"
  • Creó una copia de index.php dentro del directorio junto con un .htaccess ajustado y enlaces simbólicos a las carpetas de Magento (aplicación /, errores /, ...)
  • Se crearon enlaces simbólicos "de", "en", etc. dentro del directorio raíz de Magento apuntando al directorio "carpetas de idiomas"

De esta forma podemos agregar un nuevo idioma creando un nuevo enlace simbólico (por ejemplo, "fr").

En el backend configuramos la tienda base urlparadomain.com/en

Si usa nginx, es necesaria una actualización del procesamiento de su ubicación para procesar index.php también en la nueva subcarpeta. Esto debe hacerse para cada nueva carpeta de traducción


snh_nl ¿Hay alguna posibilidad de que expliques lo que significan tus últimas 2 líneas? Tengo el mismo problema que dijiste antes, pero no puedo entenderlo: si usas nginx, es necesaria una actualización del procesamiento de tu ubicación para procesar index.php también en la nueva subcarpeta. Esto debe hacerse para cada nueva carpeta de traducción. Estoy usando nginx y estoy tratando de hacer lo mismo. Gracias
vbak

location @rewrite { rewrite /(../)? /$1index.php; }
snh_nl

2

Hay una entrada en la base de conocimiento oficial de Magento que describe exactamente eso.

En caso de que esté trabajando con Apache, asegúrese de que todas las entradas de Virtual Host (para cada dominio) apunten a la misma raíz del documento donde se encuentra su instalación de Magento. Eso es para múltiples dominios.

Lo siguiente (y último) es el .htaccess en la misma carpeta de instalación de Magento. .htaccess es un poderoso archivo de configuración de nivel de directorio donde puede establecer reglas-acciones por cada solicitud del servidor. Por lo tanto, deberá manejar todas las acciones de (sub) dominios / carpetas diferentes y establecer las variables de servidor correctas que Magento usa en la etapa de inicialización.

Una vez que haya terminado con la configuración del servidor, tendrá que establecer diferentes rutas base para cada una de las tiendas en Magento admin (sistema - configuración - general - web).

Así que asegúrese de seguir la guía oficial (que también es la forma preferida) y las cosas deberían funcionar sin problemas.


1
La pregunta no era sobre múltiples dominios.
Fabian Schmengler

La pregunta era sobre la configuración de varios pisos CON DOMINIOS MÚLTIPLES (.org y .ch son dominios diferentes). Sin embargo, no es importante, porque la respuesta proporcionada describe una solución para la configuración de varios niveles, independientemente de si tiene varios dominios, subdominios o simplemente subcarpetas diferentes para cada una de sus tiendas.
Jernej Golja

1
Pero el foco estaba en las rutas para las vistas de la tienda, no parecía que los dominios fueran un problema. De todos modos, después de su edición, cambié mi voto.
Fabian Schmengler

1
Exactamente, el problema no es que se deban usar múltiples dominios, sino que varias tiendas deben compartir la misma ruta / "subcarpeta", lo cual no es posible al agregar códigos de tienda a la URL.
Matthias Zeis

-2

Primero debe hacer alguna configuración en el panel de administración de Magento, luego crear un subdirectorio, y mover index.php y .htaccess al subdirectorio, y hacer algunos cambios menores en index.php.

Aquí hay un ejemplo completo de cómo hacer esto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.