.htaccess reescribir para redirigir la URL raíz al subdirectorio


246

Tratando de conseguir

www.example.com

ir directamente a

www.example.com/store

He intentado varios bits de código y ninguno funciona.

Lo que probé:

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^(.+)\www.example\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]

¿Qué estoy haciendo mal?

Respuestas:


275

Puede usar una regla de reescritura que use ^ $ para representar la raíz y reescribirla en su directorio / store, así:

RewriteEngine On
RewriteRule ^$ /store [L]

66
RewriteRule ^ /? $ /Index.do [R]
barclay

2
^ / $ nunca parece coincidir, así que supongo que ^ /? $ no es necesario.
Nates

¿Es posible mostrar la URL completa y continuar procesando las reglas? En mi caso, reescribo algunas URL para que sean bonitas. Esto mantiene la url example.com: me gustaría example.com/store y luego continuar con otras reescrituras.
gin93r

Funciona bien para mí también.
Jitesh Sojitra

1
Recientemente, pasé mucho tiempo depurando por qué esto no funcionaba en un sitio en Ubuntu Apache 2.4.7. La depuración de reescritura mostró que la regla se vio afectada y generó una REDIRECCIÓN INTERNA. Luego pareció aparcar eso y buscar una página de índice. Resulta que si mod_dir está habilitado Y hay un candidato de página de índice en el directorio, entonces anula mod_rewrite, A MENOS que establezca: DirectoryCheckHandler On
Gerrit

142

Me sorprendió que nadie mencionara esto:

RedirectMatch ^/$ /store/

Básicamente, redirige la raíz y solo la URL raíz. La respuesta se originó en este enlace.


3
gracias, esto funcionó muy bien para mí con una regla ya existente. no conflicto.
científico

1
Este funciona perfectamente. Además, cubre tanto http como https.
Sayem Shafayet

3
Y esto para la redirección 301:RedirectMatch 301 ^/$ /store/
Andrea

Sí, es más simple que con reescribir. ¡Gracias!
Orden

2
@Andrea Y esto para la redirección temporal 302: RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani

108

Prueba esto:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteRule ^$ store [L]

Si desea una redirección externa (que hace que el navegador visitante muestre la URL redirigida), configure también el Rindicador allí:

RewriteRule ^$ /store [L,R=301]

44
Eso funcionó muy bien. Tanto sample.com como www.sample.com redirigen a www.sample.com/store. Eso es justo lo que quería. Gracias Gumbo, y todos los que respondieron. Aprendí mucho leyendo sus respuestas y aprecio los comentarios.

1
Tengo curiosidad, ¿se mostrará www.example.comcomo el URI después de la redirección? Si no, ¿cómo se cambiaría para hacerlo?
stefmikhail

1
♦ - ¿Y por qué su solución sería mejor que la de Sander abajo? Noté que su línea final es la misma, pero si eso es todo lo que se necesita, ¿por qué incluir el RewriteCondy el primero RewriteRule?
stefmikhail

si utiliza este código, ¿puede escribir en su navegador exmple.com/../aboveSubDir?

@GamErix Esto lo resolvería /aboveSubDirel navegador o el servidor.
Gumbo

79

Esto es lo que solía redirigir a un subdirectorio. Esto lo hizo de forma invisible y aún permite solicitudes que coinciden con un archivo existente o lo que sea.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteCond %{REQUEST_URI} !^/subdir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subdir/$1
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteRule ^(/)?$ subdir/index.php [L]

Cambie site.com y subdirectorio con sus valores.


Funciona como se esperaba! ¡Excelente!
kachar

la página de inicio era 'sigilosa' ... pero una vez que hago clic en un enlace, el nombre del subdirectorio aparece en la barra de direcciones ... ¿hay alguna manera de evitar que aparezca el nombre del subdirectorio?
dsdsdsdsd

44
solo hace root - no hace subdirectorios
php-b-grader

3
Para mí da "Error interno del servidor": /
Pithikos

1
Muchas gracias, no sabes cuánto tiempo he estado buscando esto exactamente.
Base Desire

26

Para establecer una redirección invisible desde la raíz a la subcarpeta, puede usar la siguiente RewriteRule en /root/.htaccess:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/subfolder
RewriteRule ^(.*)$ /subfolder/$1 [NC,L]

La regla anterior redirigirá internamente el navegador desde:

a

Y

a

mientras que el navegador permanecerá en la carpeta raíz.


1
Esta debería ser la respuesta aceptada ... La RewriteRule (como se sugiere en algunas otras respuestas) causa una redirección infinita, ya que / subcarpeta se redirige a / subfolder / subfolder, etc. ... RewriteCond% {REQUEST_URI}! ^ / Subfolder se asegura de que si una URL ya se redirige, no se vuelva a hacer
patrick

21

Otra alternativa si desea reescribir la URL y ocultar la URL original:

RewriteEngine on
RewriteRule ^(.*)$ /store/$1 [L]

Con esto, si por ejemplo escribe http://www.example.com/product.php?id=4, se abrirá el archivo de manera transparente en, http://www.example.com/store/product.php?id=4pero sin mostrar al usuario la url completa.


2
Agregue QSA(cadena de consulta anexar) a [L]( [L, QSA]) si desea que las cadenas de consulta se transfieran a la url reescrita.
devios1

@chaiguy gracias por el consejo, pero en mi servidor funcionó sin QSA (pero estoy de acuerdo en que probablemente sea mejor agregar QSA). ¿Quizás es por alguna configuración especial de mi servidor apache?
gaboroso

1
Este método para mí, example.com, muestra el contenido de example.com/store de forma transparente, pero example.com/test redirige a example.com/store/test, mostrando la URL
Geoffrey Hale

14

Esta parecía la solución más simple:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]

Estaba recibiendo bucles de redireccionamiento con algunas de las otras soluciones.


2
este no oculta el directorio
php-b-grader

8

No entiendo tu pregunta ...

Si desea redirigir cada solicitud a una subcarpeta:

RewriteRule ^(.*)$ shop/$1 [L,QSA]

http://www.example.com/* -> wwwroot/store/*

Si desea redirigir a una subcarpeta que tiene el nombre de dominio

RewriteCond %{HTTP_HOST} ([^\.]+\.[^\.]+)$
RewriteRule ^(.*)$ %1/$1 [L,QSA]

http://www.example.com/* -> wwwroot/example.com/*

Me gusta su código ([^\.]+\.[^\.]+)$para reservar dominio como nombre de subcarpeta.
Chetabahana

6

He descubierto que para evitar la redirección circular, es importante limitar el alcance de la redirección al directorio raíz. Yo hubiera usado:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]

6

La mayoría de las soluciones anteriores son correctas, pero a todas les falta la transparencia de la redirección.

En mi caso, cuando visité www.example.com quería ser redirigido al subdirectorio / tienda pero sin actualizar la URL a www.example.com/store . (Todo lo que quiero es obtener el código de la página de ese directorio). Si ese es su caso, la solución a continuación funciona perfectamente.

RewriteEngine on
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ /store/$1 [L]

fuente: http://wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory


¿Qué debo cambiar si necesito que www.example.com sea redirigido a www.othersite.com/store sin actualizar la URL? Lo intenté pero no pude adaptar su código
pasos del

Traté de cambiar la última línea RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]pero actualiza la URL
pasos del

Todo lo que necesitas es reemplazar las palabras exampley store.
Mahmoud Zalt

No lo expliqué muy bien. Poseo example.comy otherpage.comdominios. Cuando visito example.comquiero que se muestre el contenido otherpage.com/subfolder, sin actualizar la URL
pasos del

Bueno, mi respuesta anterior no hace eso. Intenta publicar una nueva pregunta.
Mahmoud Zalt


4

Anteriormente utilizo el siguiente código, que funciona correctamente para redirigir la URL raíz de cada uno de mis dominios / subdominios a sus subdirectorios de correspondencia que se nombran exactamente como el sub / dominio en sí mismo, como se muestra a continuación:

RewriteCond %{HTTP_HOST} ^sub1.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain1.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub1.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub2.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

Sin embargo, cuando quiera agregar otros subs o dominios, será necesario agregarlos en el código anterior. Debería ser mucho más conveniente simplificarlo para que funcione como comodín (*) como se muestra a continuación:

RewriteCond %{HTTP_HOST} ^sub
RewriteCond %{REQUEST_URI} !/subs/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

Entonces, cada vez que se agreguen otros subdominios / dominios, siempre que el nombre del subdominio tenga un prefijo de sub (como: sub3.domain1.com, sub1.domain3.com, etc.) el código seguirá siendo válido.


3

Creo que los principales problemas con el código que publicaste son:

  • la primera línea coincide en un host que comienza estrictamente con sample.com, por lo que www.sample.com no coincide.

  • la segunda línea quiere al menos un personaje, seguido de www.sample.com que tampoco coincide (¿por qué escapaste de la primera w?)

  • ninguna de las reglas incluidas redirige a la url que especificó en su objetivo (además, la muestra está mal escrita como samle, pero eso es irrelevante).

Como referencia, aquí está el código que tiene actualmente:

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^sample.com$
RewriteRule (.*) http://www.sample.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^(.+)\www.sample\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]

2

Un poco de google, me da estos resultados:

RewriteEngine en
RewriteBase /
RewriteRule ^ index. (. *)? $ Http://domain.com/subfolder/ [r = 301]

Esto redirigirá cualquier intento de acceder a un archivo llamado index.something a su subcarpeta, ya sea que el archivo exista o no.

O prueba esto:

RewriteCond% {HTTP_HOST}! ^ Www.sample.com $ [NC]
RewriteRule ^ (. *) $% {HTTP_HOST} / samlse / $ 1 [R = 301, L]

No he hecho mucha redirección en el archivo .htaccess, así que no estoy seguro de si esto funcionará.


2

Dos formas de obtener posibles soluciones para lograr esto son: 1. Cree un .htaccessarchivo en la carpeta raíz como se indica a continuación (solo reemplace example.com y my_dir con sus valores correspondientes):

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/my_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /my_dir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ my_dir/index.php [L] 
</IfModule>
  1. Use RedirectMatch para redirigir la URL raíz "/" a otra carpeta o URL,

    RedirectMatch ^ / $ http://www.example.com/my_dir


1

intente usar las siguientes líneas en htaccess

Nota: es posible que deba verificar cuál es el nombre de default.html

default.html es el archivo que se carga por defecto en la carpeta raíz.

RewriteEngine

Redirect /default.html http://example.com/store/


0

solo agrega este código a su archivo .htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /folder/index.php [L]
</IfModule>

0

Contestaré la pregunta original no señalando otra sintaxis posible (hay muchas entre las otras respuestas) sino señalando algo con lo que una vez tuve que lidiar, que me llevó un tiempo descubrir:

What am I doing wrong?

Existe la posibilidad de que% {HTTP_HOST} no se complete correctamente o que no se complete. Aunque, solo he visto que esto ocurre en una sola máquina en un host compartido, con algunos parches personalizados apache 2.2, sin embargo, es una posibilidad.


0

Esto probará el subdirectorio si el archivo no existe en la raíz. Lo necesitaba cuando moví un sitio web .html básico que espera ejecutarse en el nivel raíz y lo empujé a un subdirectorio. Solo funciona si todos los archivos son planos (no es posible el truco .htaccess en el subdirectorio). Útil para cosas vinculadas como archivos css y js.

# Internal Redirect to subdir if file is found there.
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-s
RewriteCond %{DOCUMENT_ROOT}/subdir/%{REQUEST_URI} -s
RewriteRule ^(.*)$ /subdir/$1 [L]
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.