Eu já vi isso em alguns .htaccess
exemplos
RewriteBase /
Parece ser um pouco semelhante em funcionalidade ao <base href="">
HTML.
Eu acredito que ele pode acrescentar automaticamente seu valor ao início das RewriteRule
declarações (possivelmente aquelas sem uma barra principal)?
Não consegui fazê-lo funcionar corretamente. Acho que seu uso pode ser muito útil para a portabilidade do site, pois geralmente tenho um servidor de desenvolvimento diferente de um servidor de produção. Meu método atual me permite excluir partes de minhas RewriteRule
declarações.
Alguém pode me explicar brevemente como implementá-lo?
obrigado
.htaccess
mod-rewrite
alex
fonte
fonte
Respostas:
Em minhas próprias palavras, depois de ler os documentos e experimentar:
Você pode usar
RewriteBase
para fornecer uma base para suas reescritas. Considere istoEssa é uma regra real que usei para garantir que os URLs tenham uma barra final. Isso irá converter
para
Ao ter
RewriteBase
lá, você faz o caminho relativo sair doRewriteBase
parâmetro.fonte
$1
corresponde ao padrão RewriteRule entre parênteses, mas o caminho relativo para a substituição sai do parâmetro RewriteBase. Então, a substituição resultante é/~new/$1/
.RewriteBase
diretivas. Em resumo, você não pode ter mais de um - acho que a últimaRewriteBase
diretiva vence e afeta todo o arquivo .htaccess.RewriteBase
para fornecer uma base para suas regravações" - que é praticamente apenas um rearranjo das palavras - mas não tenho idéia do que a "base" é , neste contexto, nem como o significado da o exemplo que você deu seria diferente se aRewriteBase
linha fosse removida. Off ao I go manual de ...RewriteBase
é aplicado apenas ao destino de uma regra de reescrita relativa .Usando RewriteBase como este ...
é essencialmente o mesmo que ...
Mas quando o arquivo .htaccess está dentro
/folder/
, isso também aponta para o mesmo destino:Embora os documentos impliquem sempre o uso de a
RewriteBase
, o Apache geralmente o detecta corretamente para caminhos no DocumentRoot, a menos que:Você está usando
Alias
diretivasVocê está usando regras de reescrita .htaccess para executar redirecionamentos HTTP (em vez de apenas reescrever silenciosamente) para URLs relativos
Nesses casos, você pode achar que precisa especificar o RewriteBase.
No entanto, como é uma diretiva confusa, geralmente é melhor especificar simplesmente URIs absolutos (também conhecidos como "root-root") em seus destinos de reescrita. Outros desenvolvedores que leem suas regras as entenderão mais facilmente.
Citando a excelente resposta detalhada de Jon Lin aqui :
Em um arquivo htaccess, mod_rewrite funciona de maneira semelhante a um
<Directory>
ou<Location>
container. e oRewriteBase
é usado para fornecer uma base de caminho relativa.Por exemplo, digamos que você tenha esta estrutura de pastas:
Então você pode acessar:
http://example.com/
(raiz)http://example.com/subdir1
(subdir1)http://example.com/subdir2
(subdir2)http://example.com/subdir2/subsubdir
(subsubdir)O URI que é enviado por meio de
RewriteRule
é relativo ao diretório que contém o arquivo htaccess. Então, se você tem:/a/b/c/d
, então o URI ($1
) capturado éa/b/c/d
.subdir2
e a solicitação estiver/subdir2/e/f/g
, o URI capturado estaráe/f/g
.subsubdir
e a solicitação estiver/subdir2/subsubdir/x/y/z
, o URI capturado estaráx/y/z
.O diretório em que a regra está possui essa parte removida do URI. A base de reescrita não afeta isso; é assim que funciona por diretório.
O que a base de reescrita faz é fornecer uma base de caminho de URL ( não uma base de caminho de arquivo) para quaisquer caminhos relativos no destino da regra . Então diga que você tem esta regra:
O
bar.php
caminho é relativo, em oposição a:onde o
/bar.php
é um caminho absoluto. O caminho absoluto será sempre a "raiz" (na estrutura de diretórios acima). Isso significa que, independentemente de a regra estar na "raiz", "subdir1", "subsubdir" etc.), o/bar.php
caminho sempre é mapeado parahttp://example.com/bar.php
.Mas a outra regra, com o caminho relativo, é baseada no diretório em que a regra está. Portanto, se
está na "raiz" e você acessa
http://example.com/foo
, é servidohttp://example.com/bar.php
. Mas se essa regra estiver no diretório "subdir1" e você forhttp://example.com/subdir1/foo
, será atendidohttp://example.com/subdir1/bar.php
. etc. Isso às vezes funciona e às vezes não, como diz a documentação, é necessário para caminhos relativos, mas na maioria das vezes parece funcionar. Exceto quando você está redirecionando (usando aR
bandeira ou implicitamente porque você temhttp://host
no destino da sua regra). Isso significa esta regra:se é no diretório "subdir2", e você vai para
http://example.com/subdir2/foo
, mod_rewrite vai confundir o caminho relativo como um arquivo-caminho em vez de um URL-path e por causa daR
bandeira, você vai acabar sendo redirecionado para algo como:http://example.com/var/www/localhost/htdocs/subdir1
. O que obviamente não é o que você deseja.É aqui que
RewriteBase
entra. A diretiva diz ao mod_rewrite o que acrescentar ao início de cada caminho relativo. Então, se eu tiver:em "subsubdir", vou
http://example.com/subdir2/subsubdir/foo
realmente me servirhttp://example.com/blah/bar.php
. O "bar.php" é adicionado ao final da base. Na prática, este exemplo geralmente não é o que você deseja, porque você não pode ter várias bases no mesmo contêiner de diretório ou arquivo htaccess.Na maioria dos casos, é usado assim:
onde essas regras estariam no diretório "subdir1" e
estaria no diretório "subsubdir".
Em parte, isso permite que você torne suas regras portáteis, para que você possa descartá-las em qualquer diretório e precisar alterar apenas a base, em vez de várias regras. Por exemplo, se você tivesse:
tal que vai
http://example.com/subdir1/foo
servirhttp://example.com/subdir1/bar.php
etc. E diga que você decidiu mover todos esses arquivos e regras para o diretório "subsubdir". Em vez de alterar todas as instâncias de/subdir1/
para/subdir2/subsubdir/
, você poderia ter apenas uma base:E então, quando você precisava mover esses arquivos e as regras para outro diretório, basta alterar a base:
e é isso.
fonte
RewriteEngine On
. Não é necessário 1and1, por exemplo, mas é necessário no meu servidor dedicado.AFAIK, RewriteBase é usado apenas para corrigir casos em que o mod_rewrite está sendo executado em um
.htaccess
arquivo que não está na raiz de um site e adivinha o caminho da Web errado (em oposição ao caminho do sistema de arquivos) para a pasta em que está sendo executado. RewriteRule em um .htaccess em uma pasta que mapeia parahttp://example.com/myfolder
você pode usar:Se mod_rewrite não estiver funcionando corretamente.
Tentar usá-lo para obter algo incomum, em vez de corrigir esse problema, parece uma receita para ficar muito confuso.
fonte
RewriteBase é útil apenas em situações em que você só pode colocar um .htaccess na raiz do seu site. Caso contrário, é melhor colocar os diferentes arquivos .htaccess em diretórios diferentes do site e omitir completamente a diretiva RewriteBase.
Ultimamente, para sites complexos, eu os expulso, porque torna a implantação de arquivos do teste em execução apenas mais uma etapa complicada.
fonte
Quando desenvolvo, ele está em um domínio diferente dentro de uma pasta. Quando coloco um site no ar, essa pasta não existe mais. O uso do RewriteBase permite que eu use o mesmo arquivo .htaccess nos dois ambientes.
Quando ao vivo:
Ao desenvolver:
fonte
%{REQUEST_URI}
em umaRewriteCond
diretiva, por exemplo?A explicação mais clara que encontrei não estava nos documentos atuais do apache 2.4, mas na versão 2.0 .
Como funciona? Para você, hacker apache, este documento 2.0 fornece "informações detalhadas sobre as etapas de processamento interno".
Lição aprendida: Embora tenhamos que estar familiarizados com a "corrente", as gemas podem ser encontradas nos anais.
fonte
Este comando pode definir explicitamente o URL base para suas reescritas. Se você deseja iniciar na raiz do seu domínio, inclua a seguinte linha antes da RewriteRule:
fonte
Acredito que este trecho da documentação do Apache complementa bem as respostas anteriores:
fonte