.htaccess reescribe el subdominio al directorio

Respuestas:

107

Intente poner esto en su archivo .htaccess:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^sub.domain.com
RewriteRule ^(.*)$ /subdomains/sub/$1 [L,NC,QSA]

Para una regla más general (que funciona con cualquier subdominio, no solo sub) reemplace las dos últimas líneas con esto:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ subdomains/%1/$1 [L,NC,QSA]
Ansari
fuente
3
La solución de Ansari funcionará, sin embargo, cuando navego http://test.domain.com, la URL me redirige a http://test.domain.com/subdomains/test/. ¿Es posible sin mostrar el /subdomains/test/al final?
Erik Djupvik
2
En ese caso, creo que tendrá que considerar el uso de mod_proxy y especificar una Pbandera además de L.
Ansari
1
No, redirige a http://test.domain.com/subdomains/test/, cuando solo quiero que se muestrehttp://test.domain.com/
Erik Djupvik
1
No veo cómo se redirige a test.domain.com/subdomains/test, tal vez haya algo más aquí. ¿Puedes agregar RewriteBase /justo después RewriteEngine on? Además, si desea que siga mostrándose test.domain.com, tendrá que usar mod_proxy y la [P]bandera.
Ansari
1
Pude hacer que funcionara usando la respuesta de @ anubhava aquí: stackoverflow.com/a/22395008/128984
Micah
50

No soy un experto en mod_rewrite, a menudo lucho con eso, pero he hecho esto en uno de mis sitios, es posible que necesite otras banderas, etc., dependiendo de sus circunstancias. Estoy usando esto:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^subdomain\.example\.com$
RewriteCond %{REQUEST_URI} !^/subdomains/subdomain
RewriteRule ^(.*)$ /subdomains/subdomain/$1 [L] 

Cualquier otra regla de reescritura para el resto del sitio debe aplicarse posteriormente para evitar que interfieran con la reescritura de su subdominio.

Lee Kowalkowski
fuente
Yo diría que sí. Encontré que esta configuración es la correcta, igual que mi respuesta aquí .
Chetabahana
5
Solo como referencia, en caso de que alguien que comience .htaccessllega a esta página (como lo hice yo), además de crear el .htaccessarchivo real , para que sea efectivo, debe establecer AllowOverridesu VirtualHostconfiguración ( stackoverflow.com/a/22819550/1657502 ) , habilite el rewritemódulo de Apache y luego reinicie Apache ( stackoverflow.com/a/5758551/1657502 )
Antonio Vinicius Menezes Medei
Esto no funcionará si usa www para visitar el subdominio. La solución @Minh funcionará en todos los casos.
Rohan Khude
@RohanKhude, ¿te refieres a si quieres que www.example.com y example.com ofrezcan contenido diferente? Porque normalmente, para SEO, tendría www.example.com para emitir un redireccionamiento permanente a example.com o viceversa.
Lee Kowalkowski
1
@RohanKhude www como subdominio de un subdominio también es algo que también tendría que hacer para trabajar a nivel de DNS, ¿no es así? Creo que su expectativa de que debería funcionar para cualquier subdominio arbitrario es incorrecta. La respuesta de Minh ( stackoverflow.com/a/41389905/30945 ) asume que su configuración de .htaccess admite 1 y solo 1 subdominio, por lo que es menos robusto en ese aspecto. Mi solución admite tantos subdominios como necesite, pero sí, debe definir explícitamente cada subdominio admitido, pero un www.prefijo opcional probablemente se admita mejor mediante una redirección que una reescritura.
Lee Kowalkowski
16

Puede usar la siguiente regla en .htaccess para reescribir un subdominio en una subcarpeta:

RewriteEngine On

 # If the host is "sub.domain.com"
 RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
 # Then rewrite any request to /folder
 RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L]

Explicación línea por línea:

  RewriteEngine on

La línea anterior le dice al servidor que encienda el motor para reescribir las URL.

  RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]

Esta línea es una condición para RewriteRule en la que coincidimos con el host HTTP utilizando un patrón de expresiones regulares. La condición dice que si el host es sub.domain.com , ejecute la regla.

 RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L]

La regla coincide con http://sub.domain.com/foo y la redirige internamente a http://sub.domain.com/folder/foo .

Reemplace sub.domain.com con su subdominio y carpeta con el nombre de la carpeta a la que desea apuntar su subdominio.

Amit Verma
fuente
1
Esta es la respuesta correcta para mí: explicación de cómo llegué aquí de la siguiente manera. Llegué aquí buscando un antiguo problema con la redirección de subdominios que aparentemente se rompió cuando instalé SSL en el TLD del sitio principal. Inicialmente, la redirección todavía intentaba usar el TLD del sitio principal y rompía las reglas de seguridad. Lo que necesitaba era mantener el subdominio (que estaba en un TLD completamente diferente) en el mismo host, pero lejos del sitio principal. Agregar una regla de reescritura como arriba me permitió reenviar el subdominio completo a la carpeta alojada en el sitio principal de TLD.
Richard Bown
8

Tuve el mismo problema y encontré una explicación detallada en http://www.webmasterworld.com/apache/3163397.htm

Mi solución (el contenido de los subdominios debe estar en una carpeta llamada sd_subdomain:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} subdomain\.domain\.com
RewriteCond $1 !^sd_
RewriteRule (.*) /sd_subdomain/$1 [L]
Pablo Torrecilla
fuente
1
No me funciona, ¿debo configurar algo en la zona dns del dominio?
totoaussi
1
@totoaussi debe crear un registro * A o un registro A por subdominio, apuntando al mismo servidor.
Pablo Torrecilla
4

Esto redirige a la misma carpeta a un subdominio:

.httaccess

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain\.com/subdomains/%1
jmsmarcelo
fuente
3

Intente poner este archivo .htaccess en la carpeta del subdominio:

RewriteEngine On

RewriteRule ^(.*)?$ ./subdomains/sub/$1

Redirige a http://domain.com/subdomains/sub/ , cuando solo desea que muestre http://sub.domain.com/

Minh Trịnh
fuente
La pregunta se hizo en 2012 y tiene 8 respuestas. ¿Su respuesta agrega valor en este momento?
ppovoski
Esta solución funcionará incluso si usa www para visitar el subdominio
Rohan Khude
2

Redirigir el directorio del subdominio:

RewriteCond %{HTTP_HOST} ^([^.]+)\.(archive\.example\.com)$ [NC]
RewriteRule ^ http://%2/%1%{REQUEST_URI} [L,R=301]
Mayank Awasthi
fuente
0

Para cualquier solicitud de subdominio, use esto:

RewriteEngine on 
RewriteCond %{HTTP_HOST} !^www\.band\.s\.co 
RewriteCond %{HTTP_HOST} ^(.*)\.band\.s\.co 
RewriteCond %{REQUEST_URI} !^/([a-zA-Z0-9-z\-]+) 
RewriteRule ^(.*)$ /%1/$1 [L] 

Simplemente haga que alguna carpeta sea igual al nombre de subdominio que necesita. La carpeta debe existir así: dominio.com/sub para subdominio.com .

Hafij Khan
fuente
Esto funciona para mí pero no conserva el archivo. Por ejemplo, sub.domain.com/index.php throw 404
Paolo Falomo