htaccess 301 redirecionar do diretório para o arquivo

1

Eu herdei um site (um fórum vbulletin ) e migrei-o de outra hospedagem para a minha, copiando tudo com scp comando. O diretório raiz tinha o seguinte .htaccess

RewriteOptions inherit

RewriteEngine on
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^/?$ "http\:\/\/example\.com\/forums\/content\/" [R=301,L]

Eu não sei como isso deveria funcionar, mas funcionou, independentemente do fato de que a pasta /forums/content/ NÃO existia. No entanto, uma vez movido para minha hospedagem, ele parou de funcionar, gerando um erro 404. Já que o arquivo /forums/content.php existe, eu editei o .htaccess assim:

RewriteOptions inherit

RewriteEngine on
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^/?$ "http\:\/\/example\.com\/forums\/content.php" [R=301,L]

Agora está funcionando, com uma falha: meu navegador (e todos os outros navegadores do usuário do fórum) está armazenando em cache o redirecionamento 301 anterior, para que eu possa acessar e usar o fórum apenas se eu limpar o cache do navegador (uma vez) ou se insira a URL content.php manualmente (todas as vezes).

Eu tentei a solução alternativa para adicionar um redirecionamento de /forums/content/ a /forums/content.php , adicionando um RewriteRule a .htaccess :

RewriteOptions inherit

RewriteEngine on
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^/forums/content/$ "http\:\/\/example\.com\/forums\/content.php" [R=301,L]
RewriteRule ^/?$ "http\:\/\/example\.com\/forums\/content.php" [R=301,L]

No entanto, parece que a regra é ignorada, porque o navegador ainda recebe um erro 404 no diretório /forums/content/ e não redireciona para content.php . O que estou fazendo errado?

    
por Lucio Crusca 08.01.2017 / 17:35

1 resposta

2

Como o meuh mencionou nos comentários, quando o mod_rewrite é usado em arquivos .htaccess por diretório, não há um prefixo de barra no caminho da URL que corresponda ao padrão RewriteRule . O prefixo de diretório (que sempre termina em uma barra ) é removido pela primeira vez.

No entanto, suas diretivas também estão na ordem errada e podem ser arrumadas. A diretiva RewriteCond se aplica ao único RewriteRule que segue. Você inseriu o RewriteRule entre essas diretivas, então você efetivamente mudou a lógica. Mas essas duas diretivas RewriteRule podem ser facilmente combinadas e essa diretiva RewriteCond parece supérflua.

A menos que você precise especificamente da diretiva RewriteOptions , eu a removerei. Isso pode ter sido exigido no host anterior.

Tente o seguinte:

RewriteEngine on
RewriteRule ^(forums/content/)?$ http://example.com/forums/content.php [R=301,L]

O padrão ^(forums/content/)?$ corresponde a /forums/content/ ou simplesmente / , que corresponde ao% originalRewriteRule.

Eu removi a diretiva RewriteCond que foi verificada em relação a HTTP_HOST . Eu suponho que deveria ter correspondido algo (ou seja, não nada). No entanto, simplesmente correspondia qualquer coisa que seria sempre verdadeira, o que parece ser um pouco inútil.

Não é necessário que todas as barras invertidas escapem na RewriteRule substituição . Esta é uma string comum, não uma regex. (Esse tipo de fuga desnecessária é típico do cPanel.)

UPDATE: você precisará garantir que o MultiViews não esteja ativado. Isso pode ser desativado com a diretiva Options perto da parte superior do arquivo .htaccess :

Options -MultiViews

Se você tiver as diretivas Options , isso pode ser combinado, por exemplo:

Options -MultiViews +FollowSymLinks

Como /forums é um diretório físico, se o MultiViews estiver ativado, isso pode resultar na modificação de uma solicitação interna para content.php (ou mesmo algo como content.html se existir) antes que o mod_rewrite seja capaz de acionar o redirecionamento.

    
por 08.01.2017 / 20:56