Estou usando o código a seguir para direcionar todas as solicitações de www para URLs não www:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
Isso funciona muito bem dentro de um arquivo .htaccess na raiz do meu site.
Por exemplo,
www.example.com -> example.com/
www.example.com/ -> example.com/
www.example.com/other_page -> exemplo.com/other_page
No entanto, se eu mover esse mesmo código para minha configuração do VirtualHost, os URLs reescritos conterão uma barra dupla à direita.
www.example.com -> example.com//
www.example.com/ -> example.com//
www.example.com/other_page -> example.com//other_page
Corrigi-o removendo a barra da regra de reescrita:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]
Mas não consigo entender o motivo disso. Alguém sabe o porquê?
fonte
RewriteRule ^/?(.*)$ http://example.com/$1 [R=301,L]
fez o truque.Isso está acontecendo porque você está capturando uma barra inicial
(.*)
e aplicando outra barra antes dela no novo local/$1
. Isso não aconteceu antes porque o mod_rewrite se comporta de maneira um pouco diferente ao operar em um contexto por diretório, em oposição a um contexto por servidor.Você pode evitar isso opcionalmente antecipando a barra. Além disso, você pode usar o RedirectMatch em um VirtualHost vazio com seus domínios excedentes, o que cria um pouco menos de processamento e pode parecer mais limpo.
fonte
Estou incluindo este post por completo.
A documentação do Apache explica por que esse comportamento ocorre muito bem e é o motivo da existência da diretiva 'RewriteBase'.
Basta incluir a diretiva 'RewriteBase' em seu arquivo .htaccess para obter o resultado desejado.
Exemplo:
Na documentação mod_rewrite do Apache 2.2:
Minha regra geral é quase sempre usar 'RewriteBase' em arquivos .htaccess, e não usá-lo na configuração do Apache.
fonte
Como não tive tempo de resolver esse problema, basta reescrever // para / :)
fonte