reescrita .htaccess para redirecionar o URL raiz para o subdiretório

246

Tentando conseguir

www.example.com

ir diretamente para

www.example.com/store

Eu tentei vários bits de código e nenhum funciona.

O que eu tentei:

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]

O que estou fazendo de errado?

Willi Mentzel
fonte

Respostas:

275

Você pode usar uma regra de reescrita que use ^ $ para representar a raiz e reescrever isso no seu diretório / store, desta forma:

RewriteEngine On
RewriteRule ^$ /store [L]

fonte
6
RewriteRule ^ /? $ /Index.do [R]
barclay
2
^ / $ nunca parece corresponder, então eu acho que ^ /? $ não é necessário.
NateS 13/03
É possível mostrar o URL completo e continuar processando as regras? No meu caso, reescrevo alguns URLs para que sejam bonitos. Isso mantém o URL example.com - eu gostaria de example.com/store e continuo com outras reescritas.
gin93r
Funciona bem para mim também.
Jitesh Sojitra
1
Recentemente, passei muito tempo depurando por que isso não funcionou em um site no Ubuntu Apache 2.4.7. A depuração de reconfiguração mostrou a regra sendo atingida e gerando um REDIRECTO INTERNO. Pareceu apenas estacionar e procurar uma página de índice. Acontece que se mod_dir está ativado e há um candidato página de índice no diretório, em seguida, ele substitui o mod_rewrite, a menos que defina: DirectoryCheckHandler On
Gerrit
142

Fiquei surpreso que ninguém mencionou isso:

RedirectMatch ^/$ /store/

Basicamente, ele redireciona a raiz e apenas a URL raiz. A resposta originou-se neste link

Dio Phung
fonte
3
obrigado, isso funcionou muito bem para mim com uma regra já existente. Sem conflito.
thescientist
1
Este funciona perfeitamente. Além disso, abrange http e https.
Sayem Shafayet
3
E isso para o redirecionamento 301:RedirectMatch 301 ^/$ /store/
Andrea
Sim, é mais simples que com reescrita. Obrigado!
Ordenou
2
@Andrea E esse redirecionamento temporário para 302: RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani
108

Tente o seguinte:

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

Se você deseja um redirecionamento externo (que faz com que o navegador visitante mostre o URL redirecionado), defina o Rsinalizador também:

RewriteRule ^$ /store [L,R=301]
quiabo
fonte
4
Isso funcionou lindamente. Sample.com e www.sample.com redirecionam para www.sample.com/store. Era exatamente o que eu queria. Obrigado Gumbo, e todos que responderam. Aprendi muito lendo suas respostas e aprecio o feedback.
1
Estou curioso, isso será exibido www.example.comcomo o URI após o redirecionamento? Caso contrário, como seria alterado para fazer isso?
stefmikhail
1
♦ - E por que sua solução seria melhor do que Sander lá embaixo? Percebo que sua linha final é a mesma, mas se isso é tudo o que é necessário, por que incluir a RewriteConde a primeira RewriteRule?
stefmikhail
se esse código for usado, você pode digitar no seu navegador exmple.com/../aboveSubDir?
@ GamErix Isso seria resolvido /aboveSubDirpelo navegador ou pelo servidor.
Gumbo
79

Aqui está o que eu usei para redirecionar para um subdiretório. Isso foi feito de forma invisível e ainda permite solicitações que correspondem a um arquivo existente ou o que quer que seja.

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]

Altere site.com e faça a divisão com seus valores.

Jage
fonte
Funciona como esperado! Ótimo!
Kachar
a página inicial era "furtiva" ... mas quando clico em um link, o nome do subdiretório aparece na barra de endereços ... existe uma maneira de impedir que o nome do subdiretório seja exibido?
Dsdsdsdsd
4
só faz raiz - não faz sub-diretórios
php-b-grader
3
Para mim, dá "Erro interno do servidor": /
Pithikos
1
Muito obrigado, você não sabe há quanto tempo estou procurando exatamente isso.
Base Desire
26

Para definir um redirecionamento invisível da raiz para a subpasta, você pode usar o seguinte RewriteRule em /root/.htaccess:

RewriteEngine on

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

A regra acima redirecionará internamente o navegador de:

para

E

para

enquanto o navegador permanecer na pasta raiz.

starkeen
fonte
1
Essa deve ser a resposta aceita ... O RewriteRule junto (como sugerido em algumas outras respostas) causa um redirecionamento infinito, já que / subpasta é redirecionada para / subpasta / subpasta, etc ... a RewriteCond% {REQUEST_URI}! ^ / Subpasta certifica-se de que se um URL já é redirecionada, não é feito novamente
patrick
21

Outra alternativa, se você deseja reescrever o URL e ocultar o URL original:

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

Com isso, se você digitar http://www.example.com/product.php?id=4, por exemplo , ele abrirá o arquivo de forma transparente em, http://www.example.com/store/product.php?id=4mas sem mostrar ao usuário o URL completo.

laborioso
fonte
2
Adicione QSA(cadeia de caracteres de consulta anexada) a [L]( [L, QSA]) se você deseja que as cadeias de consulta sejam transferidas para o URL reescrito.
devios1
@chaiguy obrigado pela dica, mas no meu servidor funcionou sem o QSA (mas concordo que provavelmente é melhor anexar o QSA). Talvez seja por causa de alguma configuração especial do meu servidor apache?
gaborous
1
Este método para mim, example.com mostra o conteúdo de example.com/store transparente mas example.com/test redirecionamentos para example.com/store/test, mostrando a url
Geoffrey Hale
14

Esta parecia a solução mais simples:

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

Eu estava recebendo loops de redirecionamento com algumas das outras soluções.

user1801050
fonte
2
este não esconde o diretório
php-b-grader
8

Não entendi sua pergunta ...

Se você deseja redirecionar todas as solicitações para uma subpasta:

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

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

Se você deseja redirecionar para uma subpasta com o nome de domínio

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

http://www.example.com/* -> wwwroot/example.com/*
inf3rno
fonte
Gosto do seu código ([^\.]+\.[^\.]+)$para reservar o domínio como nome da subpasta.
Chetabahana 16/02
6

Descobri que, para evitar o redirecionamento circular, é importante limitar o escopo do redirecionamento ao diretório raiz. Eu teria usado:

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

A maioria das soluções acima está correta, mas todas estão perdendo a transparência do redirecionamento.

No meu caso, ao visitar www.example.com, eu queria ser redirecionado para o subdiretório / loja, mas sem atualizar o URL para www.example.com/store . (tudo o que eu quero é obter o código da página nesse diretório). Se for esse o seu caso, a solução abaixo funciona perfeitamente.

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

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

Mahmoud Zalt
fonte
O que devo alterar se eu precisar que www.example.com seja redirecionado para www.othersite.com/store sem atualizar o URL? Eu tentei, mas não consegui adaptar o seu código
etapas
Tentei alterar a última linha para RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]mas ela atualiza a URL
etapas
Tudo que você precisa é substituir as palavras examplee store.
Mahmoud Zalt
Eu não expliquei muito bem. Eu possuo example.come otherpage.comdomínios. Quando visito example.com, quero que o conteúdo otherpage.com/subfolderseja exibido sem atualizar o URL
etapas
Bem, minha resposta acima não faz isso. Tente postar uma nova pergunta.
Mahmoud Zalt
4

Anteriormente, uso o código a seguir, que funciona corretamente para redirecionar a URL raiz de cada um dos meus domínios / subdomínios para seus subdiretórios de correspondência, que são nomeados exatamente como o sub / domínio em si, conforme abaixo:

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]

No entanto, quando eu quiser adicionar outros subs ou domínios, ele precisará ser adicionado no código acima. Deve ser muito mais conveniente simplificá-lo para funcionar como curinga (*), como abaixo:

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

Portanto, sempre que outros subdomínios / domínios forem adicionados, desde que o nome do subdomínio tenha um prefixo de sub (como: sub3.domínio1.com, sub1.domínio3.com etc.), o código permanecerá válido.

Chetabahana
fonte
3

Eu acho que os principais problemas com o código que você postou são:

  • a primeira linha corresponde a um host que começa estritamente com sample.com, portanto, www.sample.com não corresponde.

  • a segunda linha deseja pelo menos um caractere, seguido por www.sample.com, que também não corresponde (por que você escapou do primeiro w?)

  • nenhuma das regras incluídas é redirecionada para o URL especificado em sua meta (além disso, a amostra está incorreta como amostra, mas isso é irrelevante).

Para referência, veja o código que você possui atualmente:

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
fonte
2

Um pouco pesquisando, me dá os seguintes resultados:

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

Isso redirecionará qualquer tentativa de acessar um arquivo denominado index.something para sua subpasta, independentemente de o arquivo existir ou não.

Ou tente o seguinte:

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

Como não fiz muito redirecionamento no arquivo .htaccess, não tenho certeza se isso funcionará.

Steven
fonte
2

Duas maneiras possíveis de obter soluções para isso são: 1. Crie um .htaccessarquivo na pasta raiz como em (substitua example.com e my_dir pelos seus valores correspondentes):

<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 o RedirectMatch para redirecionar apenas o URL raiz “/” para outra pasta ou URL,

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

Mushtaq Hussain
fonte
1

tente usar as linhas abaixo no htaccess

Nota: pode ser necessário verificar qual é o nome do default.html

default.html é o arquivo carregado por padrão na pasta raiz.

RewriteEngine

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

Abouasy
fonte
0

você acabou de adicionar esse código ao seu arquivo .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
fonte
0

Responderei à pergunta original, não apontando outra sintaxe possível (existem muitas entre as outras respostas), mas apontando algo que já tive que lidar, que demorou um pouco para descobrir:

What am I doing wrong?

Existe a possibilidade de que% {HTTP_HOST} não esteja sendo preenchido corretamente ou de forma alguma. Embora eu tenha visto isso apenas em uma máquina em um host compartilhado, com alguns apache 2.2 com patches personalizados, é uma possibilidade.

Μάκης Παλάσης
fonte
0

Isso tentará subdiretirar se o arquivo não existir na raiz. Precisava disso, pois mudei um site .html básico que espera ser executado no nível raiz e o enviei para um subdiretório. Funciona apenas se todos os arquivos estiverem simples (sem truques .htaccess no subdiretório possível). Útil para itens vinculados, como arquivos css e 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
fonte