.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?

Willi Mentzel
fuente

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]

fuente
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.

Dio Phung
fuente
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]
Gumbo
fuente
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.

Jage
fuente
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.

Starkeen
fuente
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.

gaborous
fuente
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.

usuario1801050
fuente
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/*
inf3rno
fuente
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]
Nir O.
fuente
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

Mahmoud Zalt
fuente
¿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.

Chetabahana
fuente
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]
Artem Russakovskii
fuente
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á.

Steven
fuente
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

Mushtaq Hussain
fuente
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/

Abouasy
fuente
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>
karthikeyan ganesan
fuente
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.

Μάκης Παλάσης
fuente
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]
mikeytown2
fuente