htaccess reescribe el país sin subdominios

htaccess reescribe el país sin subdominios

Necesito reescribir la URL desde

us.example.com

a

example.com?country=us

sin subdominios

Probé estas 2 reglas:

1.

RewriteRule (US|EG) ?c=$1 [NC , L]

2.

RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

pero no funcionaron.

entonces... ¿hay alguna manera de hacer esto?

Respuesta1

No se puede "reescribir" una URL entre diferentes nombres de host (necesitaría implementar un proxy inverso) y supongo que una "redirección" no es deseable.

Sin embargo, si los subdominios y el dominio principal apuntan todos a la misma área del sistema de archivos, entonces no es necesario cambiar el nombre de host/dominio. Todo lo que se requiere es una reescritura normal (en el mismo host).

Para verificar el subdominio en el host solicitado, necesita una condición ( RewriteConddirectiva) que verifique la HTTP_HOSTvariable del servidor (es decir, el valor del Hostencabezado de solicitud HTTP). ElRewriteRule patróncoincide únicamente con la parte de la ruta URL de la URL.

Por ejemplo:

RewriteEngine On

RewriteCond %{QUERY_STRING} !^country=
RewriteCond %{HTTP_HOST} ^(us|eg)\.example\.com [NC]
RewriteRule ^ /?country=%1 [L]

Como se señaló anteriormente, esto supone que los subdominios y el dominio principal apuntan a la misma área del sistema de archivos. Esto es común en un sistema donde todas las solicitudes son administradas por un único CMS. (Y no está intentando cambiar el nombre de host en sus directivas de ejemplo).

La %1referencia inversa contiene el subdominio ("nosotros" o "por ejemplo", en este ejemplo) del nombre de host solicitado.

La condición adicional que verifica la ausencia del country=parámetro URL en la cadena de consulta es evitar un bucle de reescritura.

Sin embargo, ¿no ha dicho nada sobre la ruta URL? Y debería reescribir directamente en el archivo que maneja la solicitud ( index.php?). En su estado actual, la "reescritura" anterior depende de que mod_dir realice una subsolicitud adicional para DirectoryIndex.


  1. RewriteRule (US|EG) ?c=$1 [NC , L]
  2. RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

Existen numerosos errores con estas directivas:

  • Dices que has probado estos, sin embargo, el errorespaciosen elbanderasEl argumento dará como resultado un error interno del servidor 500 inmediato cuando el archivo se analice por primera vez.
  • Como se mencionó anteriormente, elRewriteRule patrón(primer argumento) coincide únicamente con la ruta URL. Esto no incluye el nombre de host.
  • La expresión regular en el n.° 1 es demasiado general y coincide con "US" o "EG"en cualquier lugar.
  • Para hacer coincidir con una URL absoluta (como parece que está intentando hacer en el segundo ejemplo), deberá hacer coincidir con THE_REQUESTla variable del servidor (que contiene la primera línea de los encabezados de la solicitud, incluya la solicitudmétodo).

información relacionada